MySQL ลบคีย์ต่างประเทศบางส่วน


190

ฉันมีตารางที่ใช้คีย์หลักในตารางอื่นหลายตารางและมีคีย์ต่างประเทศหลายตาราง

CREATE TABLE location (
   locationID INT NOT NULL AUTO_INCREMENT PRIMARY KEY
   ...
) ENGINE = InnoDB;

CREATE TABLE assignment (
   assignmentID INT NOT NULL AUTO_INCREMENT PRIMARY KEY,
   locationID INT NOT NULL,
   FOREIGN KEY locationIDX (locationID) REFERENCES location (locationID)
   ...
) ENGINE = InnoDB;

CREATE TABLE assignmentStuff (
   ...
   assignmentID INT NOT NULL,
   FOREIGN KEY assignmentIDX (assignmentID) REFERENCES assignment (assignmentID)
) ENGINE = InnoDB;

ปัญหาคือเมื่อฉันพยายามที่จะวางหนึ่งในคอลัมน์ที่สำคัญต่างประเทศ (เช่น locationIDX) มันทำให้ฉันมีข้อผิดพลาด

"ข้อผิดพลาด 1025 (HY000): ข้อผิดพลาดในการเปลี่ยนชื่อ"

ฉันจะวางคอลัมน์ในตารางการมอบหมายด้านบนโดยไม่มีข้อผิดพลาดนี้ได้อย่างไร

คำตอบ:


447

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

alter table footable drop foreign key fooconstraint

35
นี่เป็นปัญหาของฉัน ตอนนี้ฉันรู้สึกเป็นใบ้ หากใครมีปัญหานี้คุณสามารถค้นหาชื่อข้อ จำกัด ของคีย์ต่างประเทศโดยใช้ฟังก์ชัน SHOW CREATE TABLE
Drew

14
เคล็ดลับ: ใช้SHOW CREATE TABLE footable;เพื่อดูว่าชื่อของข้อ จำกัด คืออะไร ไม่ใช่ชื่อของคอลัมน์ต่อการค้นหา ขอบคุณสำหรับคำตอบ!
Chris Baker

2
คุณสามารถใช้สิ่งนี้เพื่อค้นหาข้อ จำกัด ของคีย์ต่างประเทศ: SELECT * จาก information_schema.table_constraints WHERE constraint_schema = '<ชื่อฐานข้อมูลของคุณ>' และ constraint_type = 'คีย์ต่างประเทศ'
Gayan Dasanayake

21

มีปุ่มต่างประเทศอยู่ที่นั่นเพื่อรับรองความถูกต้องของข้อมูลดังนั้นคุณจึงไม่สามารถวางคอลัมน์ได้ตราบใดที่ยังเป็นส่วนหนึ่งของรหัสต่างประเทศ คุณต้องวางกุญแจก่อน

ฉันคิดว่าแบบสอบถามต่อไปนี้จะทำ:

ALTER TABLE assignmentStuff DROP FOREIGN KEY assignmentIDX;

16

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

ALTER TABLE your_table_with_fk
  drop FOREIGN KEY name_of_your_fk_from_show_create_table_command_result,
  drop KEY the_same_name_as_above

10

ตรวจสอบสิ่งที่ชื่อ CONSTRAINT และชื่อคีย์ต่างประเทศ:

SHOW CREATE TABLE table_name;

ลบทั้งชื่อ CONSTRAINT และชื่อคีย์ต่างประเทศ:

ALTER TABLE table_name
  DROP FOREIGN KEY the_name_after_CONSTRAINT,
  DROP KEY the_name_after_FOREIGN_KEY;

หวังว่านี่จะช่วยได้!


4

ต่อไปนี้เป็นวิธีลดข้อ จำกัด รหัสต่างประเทศซึ่งใช้ได้ แก้ไขตารางlocationเปลี่ยนแปลงตารางlocation_id DROP คีย์ต่างประเทศlocation_ibfk_1;


2

เฮ้ฉันทำตามลำดับข้างบนและพบวิธีแก้ปัญหา

SHOW CREATE TABLE footable;

คุณจะได้รับชื่อ FK Constrain

ProjectsInfo_ibfk_1

ตอนนี้คุณต้องลบข้อ จำกัด นี้ โดยแก้ไขตาราง commantd

alter table ProjectsInfo drop foreign key ProjectsInfo_ibfk_1;

จากนั้นวางคอลัมน์ตาราง

alter table ProjectsInfo drop column clientId;

1

คุณมักจะได้รับข้อผิดพลาดนี้หากตารางของคุณใช้เอ็นจิ้น InnoDB ในกรณีนี้คุณต้องวาง foreign key จากนั้นทำการเปลี่ยนแปลงตารางและวางคอลัมน์

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

แสดงภูมิภาคสร้างตาราง; สิ่งนี้จะแสดงให้คุณเห็นแถวที่มุมบนซ้ายคลิกที่ตัวเลือก + คลิกที่ปุ่มเต็มข้อความจากนั้นคลิกที่ go. นอกจากนี้คุณจะได้รับชื่อของดัชนีเช่นนี้:

CONSTRAINT region_ibfk_1 คีย์ต่างประเทศ (country_id) ประเทศอ้างอิง (id) บนลบไม่ดำเนินการใด ๆ เมื่ออัปเดตไม่ดำเนินการใด ๆ ตอนนี้เพียงแค่ออก:

แก้ไขพื้นที่ตารางการวางคีย์ต่างประเทศ region_ibfk_1

หรือ

เพียงแค่พิมพ์: - แก้ไขตาราง TableName วาง foreign key TableName_ibfk_1 ;

โปรดจำไว้ว่าสิ่งเดียวคือการเพิ่ม _ibfk_1 หลังจากแท็บเล็ตของคุณเพื่อทำสิ่งนี้: - TableName _ibfk_1


0

assignmentStuffคุณไม่สามารถวางคอลัมน์ต่างประเทศที่สำคัญเพราะมันจะถูกอ้างอิงจากตาราง ดังนั้นคุณควรวางข้อ assignmentStuff.assignmentIDXจำกัด

คำถามที่คล้ายกันได้รับการถามที่นี่ ตรวจสอบที่นี่สำหรับข้อมูลเพิ่มเติม


1
ดังนั้นเนื่องจาก assignmentStuff อ้างอิงคีย์หลักของการมอบหมายฉันไม่สามารถวางคอลัมน์ locationID ของการมอบหมายได้หรือไม่ ดูเหมือนว่าจะเป็นเคาน์เตอร์ที่เข้าใจง่าย
Drew

ดูเหมือนว่าฉันจะเปลี่ยนชื่อคอลัมน์บางคำตอบของฉันจึงไม่สมเหตุสมผล ขออภัยที่ ...
โรนัลด์ Wildenberg


0

ขั้นตอนที่ 1: show create table vendor_locations;

ขั้นตอนที่ 2: ALTER TABLE vendor_locations drop foreign key vendor_locations_ibfk_1;

มันใช้งานได้สำหรับฉัน


0

ก่อนอื่นต้องได้รับชื่อที่ จำกัด จริงโดยการสืบค้นนี้

SHOW CREATE TABLE TABLE_NAME

แบบสอบถามนี้จะส่งผลให้ชื่อที่ จำกัด ของรหัสที่ต่างประเทศตอนนี้ด้านล่างแบบสอบถามจะลดลง

ALTER TABLE TABLE_NAME DROP FOREIGN KEY COLUMN_NAME_ibfk_1

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

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