Loại và định nghĩa của trường khóa ngoại và tham chiếu phải bằng nhau. Điều này có nghĩa là khóa ngoại của bạn không cho phép thay đổi loại trường của bạn.
Một giải pháp sẽ là:
LOCK TABLES
favorite_food WRITE,
person WRITE;
ALTER TABLE favorite_food
DROP FOREIGN KEY fk_fav_food_person_id,
MODIFY person_id SMALLINT UNSIGNED;
Bây giờ bạn có thể thay đổi bạn person_id
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
tạo lại khóa ngoại
ALTER TABLE favorite_food
ADD CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id);
UNLOCK TABLES;
CHỈNH SỬA:
Đã thêm khóa ở trên, cảm ơn các ý kiến
Bạn phải không cho phép ghi vào cơ sở dữ liệu trong khi thực hiện việc này, nếu không, bạn có nguy cơ gặp sự cố về tính toàn vẹn dữ liệu.
Tôi đã thêm một khóa ghi ở trên
Tất cả các truy vấn viết trong bất kỳ phiên nào khác với phiên của bạn ( INSERT, UPDATE, DELETE
) sẽ đợi đến khi hết giờ hoặc UNLOCK TABLES
; được thực hiện
http://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
CHỈNH SỬA 2: OP đã yêu cầu giải thích chi tiết hơn về dòng "Loại và định nghĩa của trường khóa ngoại và tham chiếu phải bằng nhau. Điều này có nghĩa là khóa ngoại của bạn không cho phép thay đổi loại trường của bạn."
Từ Hướng dẫn tham khảo MySQL 5.5: Các ràng buộc về chìa khóa ngoại lai
Các cột tương ứng trong khóa ngoại và khóa được tham chiếu phải có kiểu dữ liệu nội bộ tương tự bên trong InnoDB để chúng có thể được so sánh mà không cần chuyển đổi kiểu. Kích thước và dấu của các kiểu số nguyên phải giống nhau. Độ dài của các loại chuỗi không được giống nhau. Đối với cột chuỗi không nhị phân (ký tự), bộ ký tự và đối chiếu phải giống nhau.