แทรกคีย์หลักที่เพิ่มขึ้นอัตโนมัติลงในตารางที่มีอยู่


157

ฉันพยายามแก้ไขตารางที่ไม่มีคีย์หลักหรือคอลัมน์ auto_increment ฉันรู้วิธีเพิ่มคอลัมน์คีย์หลัก แต่ฉันสงสัยว่าเป็นไปได้หรือไม่ที่จะแทรกข้อมูลลงในคอลัมน์คีย์หลักโดยอัตโนมัติ (ฉันมี 500 แถวใน DB แล้วและต้องการให้รหัสพวกเขา แต่ฉันไม่ต้องการทำด้วยตนเอง) . ความคิดใด ๆ ขอบคุณมาก.


2
คุณสามารถทำการalter tableเพิ่มคีย์ได้อย่างง่ายดายแต่ MySQL จะไม่สร้าง ID สำหรับฟิลด์ที่ยังไม่มี คุณจะต้องอัปเดตฟิลด์ที่มีอยู่ด้วยตนเองจากนั้นตรวจสอบให้แน่ใจว่า auto_increment ใหม่ของคุณเริ่มต้นที่ออฟเซ็ตที่ถูกต้องซึ่งเป็นค่าเริ่มต้นที่ '1' และคุณเพิ่งจบด้วยข้อผิดพลาดที่สำคัญซ้ำ ๆ
Marc B

3
@ MarcB ฉันเพิ่งทดสอบและจริง ๆ แล้วมันได้แทรกรหัสสำหรับแถวที่มีอยู่เริ่มต้นที่ 1
Michael Berkowski

คำตอบ:


253

ALTER TABLEงบเพิ่มPRIMARY KEYคอลัมน์ทำงานอย่างถูกต้องในการทดสอบของฉัน:

ALTER TABLE tbl ADD id INT PRIMARY KEY AUTO_INCREMENT;

บนตารางชั่วคราวที่สร้างขึ้นเพื่อวัตถุประสงค์ในการทดสอบคำสั่งด้านบนสร้างAUTO_INCREMENT idคอลัมน์และแทรกค่าการเพิ่มอัตโนมัติสำหรับแต่ละแถวที่มีอยู่ในตารางเริ่มต้นด้วย 1


1
ใช่นี่เป็นประสบการณ์ของฉัน ไม่เคยจำได้ว่าต้องเรียกใช้สคริปต์แยกต่างหากเพื่อเติมรหัส auto_increment ...
Mike Purcell

1
lol..Thanks ความผิดฉันเอง. เครื่องหมายสีเขียวมีไว้สำหรับคุณเนื่องจากคุณสามารถนำไปใช้ได้ง่ายกว่า : D
FlyingCat

53
หากต้องการทำให้เป็นคอลัมน์แรกให้ใช้FIRSTเช่นALTER TABLE tbl1 ADD id INT PRIMARY KEY AUTO_INCREMENT FIRST;
David Thomas

1
@Nikkie SQLite กลศาสตร์แตกต่างกันมาก คุณจะพบคำแนะนำได้ที่นี่stackoverflow.com/questions/946011/sqlite-add-primary-key
Michael Berkowski

1
@WijaySharma หากคุณสร้างแถวด้วยการเพิ่มอัตโนมัติและต้องเรียกคืนด้วย ID ทันที MySQL เสนอLAST_INSERT_ID()ให้สำหรับค่านั้นSELECT * FROM table_name WHERE id = LAST_INSERT_ID()และ API ภาษาการเขียนโปรแกรมส่วนใหญ่มีฟังก์ชั่น / วิธีการบางอย่างเพื่อส่งคืนค่านั้นในรหัสแอปพลิเคชัน
Michael Berkowski

51

สมมติว่าคุณไม่มีคอลัมน์สำหรับการเพิ่มอัตโนมัติเช่น id, no จากนั้นคุณสามารถเพิ่มโดยใช้การสืบค้นต่อไปนี้:

ALTER TABLE table_name ADD id int NOT NULL AUTO_INCREMENT primary key FIRST

หากคุณมีคอลัมน์ให้เปลี่ยนเป็นการเพิ่มอัตโนมัติโดยใช้คำค้นหาต่อไปนี้:

 ALTER TABLE table_name MODIFY column_name datatype(length) AUTO_INCREMENT PRIMARY KEY

1
อะไรFIRSTที่สิ้นสุดไม่?
Dementic

1
มันจะทำให้idคอลัมน์ใหม่เป็นคอลัมน์แรกในตารางซึ่งตรงข้ามกับคอลัมน์สุดท้ายซึ่งเป็นลักษณะการทำงานเริ่มต้น
fmalina

ทำงานได้ดี! ขอบคุณ!
Majedur Rahaman

4

ใช่สิ่งนี้จะทำมันอาจจะไม่ดีที่สุดแม้ว่าคุณอาจต้องการสำรองข้อมูล

$get_query = mysql_query("SELECT `any_field` FROM `your_table`");

$auto_increment_id = 1;

while($row = mysql_fetch_assoc($get_query))
{
  $update_query = mysql_query("UPDATE `your_table` SET `auto_increment_id`=$auto_increment_id WHERE `any_field` = '".$row['any_field']."'");
  $auto_increment_id++;
}

แจ้งให้ทราบว่าany_fieldคุณเลือกจะต้องเหมือนกันเมื่อมีการปรับปรุง


4

สำหรับผู้ที่ชอบตัวเองได้รับMultiple primary key definedข้อผิดพลาดลอง:

ALTER TABLE `myTable` ADD COLUMN `id` INT AUTO_INCREMENT UNIQUE FIRST NOT NULL;

ใน MySQL v5.5.31 ชุดนี้idคอลัมน์เป็นคีย์หลักสำหรับฉันและเติมแต่ละแถวด้วยค่าที่เพิ่มขึ้น


2

ที่ง่ายที่สุดและเร็วที่สุดที่ฉันพบคือสิ่งนี้

ALTER TABLE mydb.mytable 
ADD COLUMN mycolumnname INT NOT NULL AUTO_INCREMENT AFTER updated,
ADD UNIQUE INDEX mycolumnname_UNIQUE (mycolumname ASC);

2

ฉันสามารถปรับคำแนะนำเหล่านี้ให้ใช้ตารางด้วยคีย์หลักที่ไม่เพิ่มขึ้นที่มีอยู่และเพิ่มคีย์หลักที่เพิ่มขึ้นลงในตารางและสร้างคีย์หลักคอมโพสิตใหม่ที่มีทั้งคีย์เก่าและใหม่เป็นคีย์หลักคอมโพสิตโดยใช้ดังต่อไปนี้ รหัส:

DROP TABLE  IF EXISTS SAKAI_USER_ID_MAP;

CREATE TABLE SAKAI_USER_ID_MAP (
       USER_ID             VARCHAR (99) NOT NULL,
       EID                 VARCHAR (255) NOT NULL,
       PRIMARY KEY (USER_ID)
);

INSERT INTO SAKAI_USER_ID_MAP VALUES ('admin', 'admin');
INSERT INTO SAKAI_USER_ID_MAP VALUES ('postmaster', 'postmaster');

ALTER TABLE  SAKAI_USER_ID_MAP 
  DROP PRIMARY KEY, 
  ADD _USER_ID INT AUTO_INCREMENT NOT NULL FIRST, 
  ADD PRIMARY KEY ( _USER_ID, USER_ID );

เมื่อดำเนินการเสร็จแล้วฟิลด์ _USER_ID จะมีอยู่และมีค่าตัวเลขทั้งหมดสำหรับคีย์หลักตรงตามที่คุณคาดหวัง ด้วย "DROP TABLE" ที่ด้านบนคุณสามารถเรียกใช้สิ่งนี้ซ้ำแล้วซ้ำอีกเพื่อทดสอบกับรูปแบบต่างๆ

สิ่งที่ฉันไม่สามารถทำงานได้คือสถานการณ์ที่มีคีย์ FOREIGN ขาเข้าที่ชี้ไปที่ฟิลด์ USER_ID แล้ว ฉันได้รับข้อความนี้เมื่อฉันพยายามทำตัวอย่างที่ซับซ้อนมากขึ้นด้วยรหัสต่างประเทศขาเข้าจากตารางอื่น

#1025 - Error on rename of './zap/#sql-da07_6d' to './zap/SAKAI_USER_ID_MAP' (errno: 150)

ฉันเดาว่าฉันจำเป็นต้องทำลายกุญแจต่างประเทศทั้งหมดก่อนที่จะทำตาราง ALTER แล้วสร้างใหม่ในภายหลัง แต่สำหรับตอนนี้ฉันต้องการแบ่งปันวิธีแก้ปัญหานี้กับคำถามต้นฉบับที่ท้าทายมากขึ้นในกรณีที่คนอื่น ๆ ประสบสถานการณ์เช่นนี้


0

ส่งออกตารางของคุณจากนั้นล้างตารางของคุณแล้วเพิ่มเขตข้อมูลเป็น INT ที่ไม่ซ้ำกันแล้วเปลี่ยนเป็น AUTO_INCREMENT แล้วนำเข้าตารางของคุณอีกครั้งที่คุณส่งออกก่อนหน้านี้


0

คุณสามารถเพิ่มคอลัมน์คีย์หลักใหม่ไปยังตารางที่มีอยู่ซึ่งสามารถมีหมายเลขลำดับโดยใช้คำสั่ง:

ALTER TABLE mydb.mytable ADD pk_columnName INT IDENTITY 

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'IDENTITY' at line 1
user1717828

0

ฉันกำลังเผชิญปัญหาเดียวกันดังนั้นสิ่งที่ฉันทำฉันทิ้งเขตข้อมูลสำหรับคีย์หลักจากนั้นฉันสร้างใหม่และตรวจสอบให้แน่ใจว่ามันเพิ่มขึ้นอัตโนมัติ ที่ทำงานให้ฉัน ฉันหวังว่ามันจะช่วยผู้อื่น


0

เปลี่ยนแปลงตารางtableName MODIFY tableNameID MEDIUMINTไม่เป็นโมฆะAUTO_INCREMENT ;

ที่นี่tableNameคือชื่อของตารางของคุณ

tableNameเป็นชื่อคอลัมน์ของคุณซึ่งเป็นหลักจะต้องมีการแก้ไข

MEDIUMINTเป็นประเภทข้อมูลของคีย์หลักที่มีอยู่ของคุณ

AUTO_INCREMENTคุณต้องเพิ่มแค่ auto_increment หลังจากไม่เป็นโมฆะ

มันจะทำให้คีย์หลัก auto_increment ......

หวังว่านี่จะเป็นประโยชน์ :)


1
มันจะมีประโยชน์ถ้าคุณแก้ไขและเพิ่มคำอธิบาย
Shashanth

-1

วิธีการเขียน PHP เพื่อแก้ไขฟิลด์ที่มีอยู่แล้ว (ชื่อในตัวอย่างนี้) เพื่อให้มันเป็นคีย์หลัก? แน่นอนว่าไม่มีการเพิ่มฟิลด์ "id" เพิ่มเติมลงในตาราง ..

ตารางนี้สร้างขึ้นในขณะนี้ - จำนวนระเบียนที่พบ: 4 ชื่อ VARCHAR (20) YES พันธุ์ VARCHAR (30) YES สี VARCHAR (20) YES น้ำหนัก SMALLINT (7) YES

นี่เป็นผลลัพธ์ที่ต้องการ (คำอธิบายตาราง) -

จำนวนระเบียนที่ค้นพบ: 4 ชื่อ VARCHAR (20) NO สายพันธุ์ PRI VARCHAR (30) YES สี VARCHAR (20) YES น้ำหนัก SMALLINT (7) YES

แทนที่จะได้รับสิ่งนี้ -

จำนวนระเบียนที่พบ: 5 id int (11) NO ชื่อ PRI VARCHAR (20) YES พันธุ์ VARCHAR (30) YES สี VARCHAR (20) YES น้ำหนัก SMALLINT (7) YES

หลังจากพยายาม ..

$ query = "แก้ไขตารางผู้แข่งขันเพิ่มรหัส INT ไม่ใช่ NULL AUTO_INCREMENT FIRST, เพิ่มรหัสหลัก (id)";

จะได้รับสิ่งนี้ได้อย่างไร -

จำนวนระเบียนที่ค้นพบ: 4 ชื่อ VARCHAR (20) NO สายพันธุ์ PRI VARCHAR (30) YES สี VARCHAR (20) YES น้ำหนัก SMALLINT (7) YES

เช่น INSERT / ADD .. ฯลฯ คีย์หลักเข้าสู่ระเบียนแรกของฟิลด์ (โดยไม่มีการเพิ่มฟิลด์ 'id' เพิ่มเติมตามที่ระบุไว้ก่อนหน้านี้

โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.