จะเพิ่มคีย์หลักในตาราง MySQL ได้อย่างไร?


104

นี่คือสิ่งที่ฉันพยายาม แต่ล้มเหลว:

alter table goods add column `id` int(10) unsigned primary AUTO_INCREMENT;

ใครมีเคล็ดลับ?


11
เมื่อมีบางอย่างล้มเหลวคุณควรระบุสิ่งที่ล้มเหลวเสมอ : คุณได้รับข้อความแสดงข้อผิดพลาด อันไหน ?
Pascal MARTIN

ฉันเดาว่าข้อความแสดงข้อผิดพลาดดูเหมือนว่า: กำหนดคีย์หลักหลายรายการ
LMD

คำตอบ:


227

หลังจากเพิ่มคอลัมน์แล้วคุณสามารถเพิ่มคีย์หลักได้ตลอดเวลา:

ALTER TABLE goods ADD PRIMARY KEY(id)

สาเหตุที่สคริปต์ของคุณไม่ทำงานคุณต้องระบุPRIMARY KEYไม่ใช่แค่คำว่าPRIMARY:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

สำหรับฉันมันบอกว่า: สิ่งนี้จะกำหนดคีย์หลักหลายตัว ฉันใช้ InnoDB หมายเหตุฉันมีอยู่แล้ว 3 รายการ
LMD

2
แน่นอนฉันจะใส่FIRSTหลังจากAUTO_INCREMENTซึ่งหมายความว่าidจะเป็นคอลัมน์แรกของตารางที่มีอยู่แล้ว มิฉะนั้นจะวางไว้ท้ายตารางตามที่เขียนไว้ตอนนี้ซึ่งอาจทำให้สับสนเล็กน้อยเมื่อทำแบบง่ายๆSELECT * ...
StefanK

วิธีรับตำแหน่งแรกในคอลัมน์ 'id' ใหม่
TipVisor

17

คอลัมน์ที่มีอยู่

หากคุณต้องการเพิ่มข้อ จำกัด ของคีย์หลักลงในคอลัมน์ที่มีอยู่ไวยากรณ์ทั้งหมดที่ระบุไว้ก่อนหน้านี้จะล้มเหลว

หากต้องการเพิ่มข้อ จำกัด ของคีย์หลักให้กับคอลัมน์ที่มีอยู่ให้ใช้แบบฟอร์ม:

ALTER TABLE `goods`
MODIFY COLUMN `id` INT(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT;

1
mysql ไม่รู้จัก MODIFY เป็นคำสั่งที่เหมาะสม (อย่างน้อยใน XAMPP, InnoDB)
LMD

@LMD คุณใช้ mysql รุ่นอะไร? (หมายเหตุ: ฉันรู้ว่ามันใช้งานได้ในเวลาที่ฉันโพสต์สิ่งนี้และฉันเชื่อว่ามันเป็น 5.6 ... แต่ฉันจำไม่ได้แน่นอน)
MER

1
ถ้าสำหรับคุณเช่นฉันมันไม่สามารถแทนที่ MODIFY ด้วย CHANGE และมันจะทำงาน!
csr-nontol

12

หากโต๊ะของคุณค่อนข้างใหญ่อย่าใช้คำสั่ง:

alter table goods add column `id` int(10) unsigned primary KEY AUTO_INCREMENT;

เนื่องจากทำสำเนาข้อมูลทั้งหมดในตารางชั่วคราวให้แก้ไขตารางแล้วคัดลอกกลับ ทำด้วยตนเองดีกว่า เปลี่ยนชื่อตารางของคุณ:

rename table goods to goods_old;

สร้างตารางใหม่ด้วยคีย์หลักและดัชนีที่จำเป็นทั้งหมด:

create table goods (
    id  int(10) unsigned not null AUTO_INCREMENT
    ... other columns ...
    primary key (id)
);

ย้ายข้อมูลทั้งหมดจากตารางเก่าไปยังใหม่ปิดใช้งานคีย์และดัชนีเพื่อเร่งการคัดลอก:

- ใช้สิ่งนี้สำหรับตาราง MyISAM :

SET UNIQUE_CHECKS=0;
    ALTER TABLE goods DISABLE KEYS;
        INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
    ALTER TABLE goods ENABLE KEYS;
SET UNIQUE_CHECKS=1;

หรือ

- ใช้สิ่งนี้สำหรับตารางInnoDB :

SET AUTOCOMMIT = 0; SET UNIQUE_CHECKS=0; SET FOREIGN_KEY_CHECKS=0;
    INSERT INTO goods (... your column names ...) SELECT ... your column names FROM goods_old; 
SET FOREIGN_KEY_CHECKS=1; SET UNIQUE_CHECKS=1; COMMIT; SET AUTOCOMMIT = 1;

ใช้เวลา 2,000 วินาทีในการเพิ่ม PK ลงในตารางที่มีแถว ~ 200 mln


ฉันแปลกใจที่ต้องค้นหานานแค่ไหนกว่าจะพบคำตอบนี้ ขอบคุณสำหรับตัวอย่างที่เป็นประโยชน์เหล่านี้
Ryan

4

ไม่แน่ใจว่าเรื่องนี้กับใครหรือเปล่า แต่ฉันชอบตาราง id ที่คอลัมน์แรกในฐานข้อมูล ไวยากรณ์สำหรับสิ่งนั้นคือ:

ALTER TABLE your_db.your_table ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT FIRST;

ซึ่งเป็นเพียงการปรับปรุงเล็กน้อยจากคำตอบแรก หากคุณต้องการให้มันอยู่ในตำแหน่งที่แตกต่างออกไป

ALTER TABLE unique_address ADD COLUMN `id` int(10) UNSIGNED PRIMARY KEY AUTO_INCREMENT AFTER some_other_column;

HTH, -ft



2

รหัสนี้ทำงานในฐานข้อมูล mysql ของฉัน:

ALTER TABLE `goods`
ADD COLUMN `id` INT NOT NULL AUTO_INCREMENT,
ADD PRIMARY KEY (`id`);



0

สำหรับฉันไม่มีคำแนะนำใดที่ทำให้ฉันมีข้อผิดพลาดของไวยากรณ์ดังนั้นฉันจึงลองใช้ phpmyadmin (เวอร์ชัน 4.9.2), (10.4.10-MariaDB) และเพิ่มidคอลัมน์ด้วยคีย์หลักที่เพิ่มอัตโนมัติ Idคอลัมน์ถูกเพิ่มเข้ามาอย่างดีจากองค์ประกอบแรก

ผลลัพธ์การค้นหาคือ:

แก้ไขตารางtable_nameเพิ่มidINT not NULL AUTO_INCREMENT FIRST, ADD PRIMARY KEY ( id);


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