ใช้ MySQL 5.5 ฉันมีตารางที่ไม่สามารถเพิ่มคีย์ต่างประเทศได้:
แก้ไขตาราง `SOURCE_TABLE`
เพิ่มข้อ จำกัด `ข้อ จำกัด FK '
คีย์ต่างประเทศ (`otherTableID`)
การอ้างอิง `OTHER_TABLE` (`id`)
บน ลบ SET NULL
บน UPDATE CASCADE;
MySQL ส่งคืนข้อผิดพลาดต่อไปนี้:
รหัสข้อผิดพลาด: 1005 ไม่สามารถสร้างตาราง 'my_schema.#sql-4c0c_b6fc8ca' (ข้อผิดพลาด: 121)
มองไปที่ แสดงสถานะ INNODB ของเครื่องยนต์
ฉันเข้าใจ:
------------------------
ข้อผิดพลาดคีย์ต่างประเทศล่าสุด
------------------------
220523 16:34:36 เกิดข้อผิดพลาดในการสร้างข้อจำกัดของคีย์นอกสำหรับตาราง `my_schema`.`#sql-4c0c_b6fc8ca`
ข้อจำกัดคีย์ต่างประเทศของชื่อ `my_schema`.`ConstraintFK`
มีอยู่แล้ว. (โปรดทราบว่าภายใน InnoDB เพิ่ม 'ชื่อฐานข้อมูล'
ข้างหน้าชื่อข้อจำกัดที่ผู้ใช้กำหนด)
โปรดทราบว่าตารางระบบ FOREIGN KEY ของ InnoDB เก็บ
จำกัด ชื่อเป็นแบบคำนึงถึงตัวพิมพ์เล็กและใหญ่ด้วย
การเปรียบเทียบ mySQL มาตรฐาน latin1_swedish_ci ถ้าคุณ
สร้างตารางหรือฐานข้อมูลที่มีชื่อต่างกันเท่านั้น
ตัวพิมพ์เล็กและใหญ่ แล้วชนกันในข้อจำกัด
ชื่อสามารถเกิดขึ้นได้ วิธีแก้ปัญหา: ตั้งชื่อข้อจำกัดของคุณ
อย่างชัดเจนด้วยชื่อเฉพาะ
แน่นอน ไม่มีข้อจำกัดชื่อ ConstraintFK ที่กำหนดไว้ในสคีมานี้ ฉันตรวจสอบทั้งสคีมาข้อมูลและ แสดงการสร้างตาราง SOURCE_TABLE
เอาต์พุต รายการหลังแสดงว่ามีดัชนีสำหรับคีย์นอกอยู่ แต่ดูเหมือนว่าไม่มีข้อจำกัดคีย์นอก:
-- แสดงเฉพาะข้อมูลที่เกี่ยวข้องเท่านั้น
สร้างตาราง `SOURCE_TABLE` (
`id` int(11) ไม่เป็นโมฆะ AUTO_INCREMENT
`otherTableID` int(11) เริ่มต้นเป็นโมฆะ
คีย์หลัก (`id`),
คีย์ `ConstraintFK_idx` (`otherTableID`)
) ENGINE=InnoDB AUTO_INCREMENT=4089 CHARSET เริ่มต้น=utf8;
สร้างตาราง `OTHER_TABLE` (
`id` int(11) ไม่เป็นโมฆะ AUTO_INCREMENT
คีย์หลัก (`id`),
) ENGINE=InnoDB AUTO_INCREMENT=58108 CHARSET เริ่มต้น=utf8;
อันที่จริง ถ้าฉันพยายามที่จะละทิ้งข้อจำกัดนั้น:
แก้ไขตาราง `SOURCE_TABLE`
วางคีย์ต่างประเทศ `ConstraintFK`;
ฉันเข้าใจ:
รหัสข้อผิดพลาด: 1025เกิดข้อผิดพลาดในการเปลี่ยนชื่อ './my_schema/SOURCE_TABLE' เป็น './my_schema/#sql2-4c0c-b6fc8ca' (ข้อผิดพลาด: 152)
ฉันดูที่ระบบไฟล์และไม่เห็นเหตุผลที่การเปลี่ยนชื่อตารางจะล้มเหลว
ขออภัย การพยายามค้นหาสคีมาข้อมูลไม่ได้ผล:
เลือก * จาก information_schema.TABLE_CONSTRAINTS
โดยที่ information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
AND information_schema.TABLE_CONSTRAINTS.CONSTRAINT_NAME = 'ConstraintFK';
ส่งกลับชุดว่างในขณะที่:
เลือก * จาก information_schema.TABLE_CONSTRAINTS
โดยที่ information_schema.TABLE_CONSTRAINTS.CONSTRAINT_TYPE = 'FOREIGN KEY'
และ information_schema.TABLE_CONSTRAINTS.CONSTRAINT_SCHEMA = 'my_schema';
ส่งคืนข้อ จำกัด ของคีย์นอกทั้งหมดใน my_schema ที่ฉันสามารถรับได้ แสดงการสร้างตาราง
คำสั่ง แต่ไม่มีสัญญาณของ ConstraintFK...
มองไปที่ นี้ และ นี้ฉันสงสัยว่ามีบางอย่างเกิดขึ้นในอดีตที่ทำให้คีย์นอกนั้นถูกละเลย: จริงๆ แล้ว SOURCE_TABLE นี้ถูกเปลี่ยนชื่อเมื่อนานมาแล้ว และฉันค่อนข้างมั่นใจว่าคีย์ต่างประเทศที่ฉันพยายามเพิ่มนั้นเคยอยู่ที่นั่นมาก่อน วิธีแก้ปัญหาที่แนะนำคือทิ้งสคีมาและสร้างใหม่จากไฟล์ดัมพ์ มีอะไรอีกบ้างที่ฉันสามารถลองได้โดยไม่ต้องทิ้งสคีมานี้ มันค่อนข้างใหญ่และการหยุดทำงานจะมีความเกี่ยวข้อง