ประเภทและคำจำกัดความของฟิลด์คีย์ต่างประเทศและการอ้างอิงต้องเท่ากัน ซึ่งหมายความว่า Foreign Key ของคุณไม่อนุญาตให้เปลี่ยนประเภทของฟิลด์ของคุณ
ทางออกหนึ่งคือ:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
ตอนนี้คุณเปลี่ยน person_id ได้แล้ว
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
สร้างคีย์ต่างประเทศใหม่
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
แก้ไข:
เพิ่มการล็อกด้านบนขอบคุณสำหรับความคิดเห็น
คุณต้องไม่อนุญาตให้เขียนลงในฐานข้อมูลในขณะที่ดำเนินการนี้มิฉะนั้นคุณจะเสี่ยงต่อปัญหาความสมบูรณ์ของข้อมูล
ฉันได้เพิ่มการล็อกการเขียนไว้ด้านบนแล้ว
การเขียนแบบสอบถามทั้งหมดในเซสชันอื่นที่ไม่ใช่ของคุณเอง ( INSERT, UPDATE, DELETE
) จะรอจนกว่าจะหมดเวลาหรือUNLOCK TABLES
; ถูกดำเนินการ
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
แก้ไข 2: OP ขอคำอธิบายโดยละเอียดเพิ่มเติมเกี่ยวกับบรรทัด "ประเภทและคำจำกัดความของฟิลด์คีย์ต่างประเทศและการอ้างอิงต้องเท่ากันซึ่งหมายความว่าคีย์ต่างประเทศของคุณไม่อนุญาตให้เปลี่ยนประเภทของฟิลด์ของคุณ"
จากคู่มืออ้างอิง MySQL 5.5: FOREIGN KEY Constraints
คอลัมน์ที่ตรงกันในคีย์ภายนอกและคีย์ที่อ้างอิงต้องมีชนิดข้อมูลภายในที่คล้ายกันภายใน InnoDB เพื่อให้สามารถเปรียบเทียบได้โดยไม่ต้องแปลงประเภท ขนาดและเครื่องหมายของชนิดจำนวนเต็มต้องเหมือนกัน ความยาวของประเภทสตริงไม่จำเป็นต้องเหมือนกัน สำหรับคอลัมน์สตริงที่ไม่ใช่ไบนารี (อักขระ) ชุดอักขระและการจัดเรียงจะต้องเหมือนกัน