ลบคีย์หลักใน MySQL


182

ฉันมีตารางคีต่อไปนี้ซึ่งแมป user_customers กับสิทธิ์ในฐานข้อมูล MySQL สด:

mysql> describe user_customer_permission;
+------------------+---------+------+-----+---------+----------------+
| Field            | Type    | Null | Key | Default | Extra          |
+------------------+---------+------+-----+---------+----------------+
| id               | int(11) | NO   | PRI | NULL    | auto_increment |
| user_customer_id | int(11) | NO   | PRI | NULL    |                |
| permission_id    | int(11) | NO   | PRI | NULL    |                |
+------------------+---------+------+-----+---------+----------------+
3 rows in set (0.00 sec)

ฉันต้องการลบคีย์หลักสำหรับ user_customer_id และ permission_id และเก็บคีย์หลักไว้สำหรับรหัส

เมื่อฉันเรียกใช้คำสั่ง:

alter table user_customer_permission drop primary key;

ฉันได้รับข้อผิดพลาดต่อไปนี้:

ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key

ฉันจะวางคีย์หลักของคอลัมน์ได้อย่างไร

คำตอบ:


286

หากไม่มีดัชนีการบำรุงรักษาคอลัมน์การสร้างอัตโนมัติจะมีราคาแพงเกินไปนั่นคือสาเหตุที่MySQLทำให้คอลัมน์การรวมอัตโนมัติเป็นส่วนที่อยู่ด้านซ้ายสุดของดัชนี

คุณควรลบคุณสมบัติ autoincrement ก่อนที่จะวางกุญแจ:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL;
ALTER TABLE user_customer_permission DROP PRIMARY KEY;

โปรดทราบว่าคุณมีคอมโพสิตPRIMARY KEYที่ครอบคลุมทั้งสามคอลัมน์และidไม่รับประกันว่าจะไม่ซ้ำกัน

หากเกิดขึ้นเป็นเอกลักษณ์คุณสามารถทำให้เป็นPRIMARY KEYและAUTO_INCREMENTอีกครั้ง:

ALTER TABLE user_customer_permission MODIFY id INT NOT NULL PRIMARY KEY AUTO_INCREMENT;

ฉันจะไม่ต้องเรียกคืนคอลัมน์ id ในฐานะคีย์หลัก auto_increment หรือไม่ แก้ไข user_customer_permission ตารางเพิ่มคีย์หลัก (id); เปลี่ยน user_customer_permission ตารางเปลี่ยน id id int (11) auto_increment;
markb

@markbAUTO_INCREMENTถ้าคุณคืนค่าคีย์หลักคุณแน่ใจหรือว่าอาจจะย้อนกลับไปมันกลับไป
Quassnoi

สิ่งนี้หมายความว่าคอลัมน์ autoincrement เป็นส่วนซ้ายสุดของคีย์หลัก ?
Arup Rakshit

1
@ArupRakshit: dev.mysql.com/doc/refman/5.6/en/… หากต้องการใช้AUTO_INCREMENTกลไกที่มีตาราง InnoDB AUTO_INCREMENTคอลัมน์ai_colจะต้องกำหนดเป็นส่วนหนึ่งของดัชนีเพื่อให้สามารถทำการSELECT MAX(ai_col)ค้นหาดัชนีที่เทียบเท่าได้บนโต๊ะเพื่อรับค่าคอลัมน์สูงสุด โดยทั่วไปสิ่งนี้สามารถทำได้โดยการทำให้คอลัมน์เป็นคอลัมน์แรกของดัชนีตารางบางตาราง
Quassnoi

มันบอกว่าประถมไม่ได้กำหนดไว้ ทำไมสิ่งนี้เกิดขึ้น ดังนั้นผมจึงต้องลบและเพิ่มอีกครั้ง ID คอลัมน์โดยไม่ได้ระบุคีย์หลัก
mrbengi

121

หนึ่งบรรทัด:

ALTER TABLE  `user_customer_permission` DROP PRIMARY KEY , ADD PRIMARY KEY (  `id` )

คุณจะไม่สูญเสียการเพิ่มอัตโนมัติและต้องเพิ่มใหม่ซึ่งอาจมีผลข้างเคียง


5
ฉันคิดว่าคำตอบนี้ต้องลอยขึ้นไปด้านบนเพราะไม่เพียง แต่ลบความจำเป็นในการเปลี่ยนคำจำกัดความของเขตข้อมูลเท่านั้น แต่ยังช่วยให้การเปลี่ยนแปลงผ่านข้อ จำกัด fk บนโต๊ะที่มีการเปลี่ยนแปลง - ช่วยฉันออกไปจริงๆ!
tomfumb

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

14

ฉันเชื่อว่า Quassnoi ได้ตอบคำถามตรงของคุณ เพิ่งทราบด้าน: บางทีนี่อาจเป็นเพียงถ้อยคำที่น่าอึดอัดใจในส่วนของคุณ แต่คุณดูเหมือนจะอยู่ภายใต้การแสดงผลที่คุณมีคีย์หลักสามตัวตัวหนึ่งในแต่ละฟิลด์ กรณีนี้ไม่ได้. คุณสามารถมีคีย์หลักได้เพียงคีย์เดียวเท่านั้น สิ่งที่คุณมีอยู่ที่นี่คือคีย์หลักที่ประกอบด้วยสามฟิลด์ ดังนั้นคุณไม่สามารถ "วางคีย์หลักในคอลัมน์" คุณสามารถวางคีย์หลักหรือไม่ปล่อยคีย์หลัก หากคุณต้องการคีย์หลักที่มีเพียงหนึ่งคอลัมน์คุณสามารถวางคีย์หลักที่มีอยู่ใน 3 คอลัมน์และสร้างคีย์หลักใหม่ใน 1 คอลัมน์




5

"หากคุณกู้คืนคีย์หลักคุณแน่ใจว่าอาจเปลี่ยนกลับเป็น AUTO_INCREMENT"

ไม่ควรมีคำถามว่าต้องการ "คืนค่าคุณสมบัติ PK" หรือไม่ "เรียกคืนคุณสมบัติการเก็บข้อมูลอัตโนมัติ" ของคอลัมน์ ID

เนื่องจากมีการสร้างอัตโนมัติในคำจำกัดความก่อนหน้าของตารางจึงมีความเป็นไปได้ค่อนข้างมากที่มีบางโปรแกรมที่แทรกลงในตารางนี้โดยไม่ต้องระบุค่า ID (เนื่องจากคอลัมน์ ID คือการสร้างอัตโนมัติต่อไป)

การดำเนินการของโปรแกรมดังกล่าวจะหยุดลงโดยไม่กู้คืนคุณสมบัติการสร้างอัตโนมัติ


3

ขั้นแรกแก้ไขคอลัมน์เพื่อลบฟิลด์ auto_increment ดังนี้: แก้ไขตาราง user_customer_permission แก้ไข id คอลัมน์ int;

ถัดไปปล่อยคีย์หลัก แก้ไข user_customer_permission ตารางหลักที่สำคัญหล่น;



1

ฉันมีปัญหาเดียวกันและอยู่ข้างๆค่าบางอย่างภายในโต๊ะของฉัน แม้ว่าฉันจะเปลี่ยนคีย์หลักของฉันด้วย

ALTER TABLEDROP PRIMARY KEY , ADD PRIMARY KEY (id user_customer_permission)

ปัญหายังคงอยู่บนเซิร์ฟเวอร์ของฉัน ฉันสร้างเขตข้อมูลใหม่ภายในตารางที่ฉันถ่ายโอนค่าไปยังเขตข้อมูลใหม่และลบเขตข้อมูลเก่าแก้ไขปัญหา !!


1

เพื่อเพิ่มคีย์หลักในคอลัมน์

ALTER TABLE table_name ADD PRIMARY KEY (column_name);

หากต้องการลบคีย์หลักออกจากตาราง

ALTER TABLE table_name DROP PRIMARY KEY;

0

สำรองฐานข้อมูลก่อน จากนั้นปล่อยคีย์ต่างประเทศที่เกี่ยวข้องกับตาราง ตัดตาราง foreign key ตัดทอนตารางปัจจุบัน ลบคีย์หลักที่ต้องการ ใช้ sqlyog หรือ workbench หรือ heidisql หรือ dbeaver หรือ phpmyadmin


0

ค้นหาตารางในตัวจัดการ SQL คลิกขวาจากนั้นเลือกการออกแบบจากนั้นคลิกขวาที่ไอคอนกุญแจเล็ก ๆ แล้วเลือกลบคีย์หลัก


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