Saya mendapatkan kesalahan ini saat mencoba mengubah tabel saya.
Error Code: 1833. Cannot change column 'person_id': used in a foreign key constraint 'fk_fav_food_person_id' of table 'table.favorite_food'
Berikut adalah PERNYATAAN CREATE TABLE saya Yang berjalan dengan sukses.
CREATE TABLE favorite_food(
person_id SMALLINT UNSIGNED,
food VARCHAR(20),
CONSTRAINT pk_favorite_food PRIMARY KEY(person_id,food),
CONSTRAINT fk_fav_food_person_id FOREIGN KEY (person_id)
REFERENCES person (person_id)
);
Kemudian saya mencoba menjalankan pernyataan ini dan saya mendapat kesalahan di atas.
ALTER TABLE person MODIFY person_id SMALLINT UNSIGNED AUTO_INCREMENT;
Jawaban:
Jenis dan definisi kolom kunci asing dan referensi harus sama. Ini berarti kunci asing Anda tidak mengizinkan perubahan jenis bidang Anda.
Salah satu solusinya adalah ini:
Sekarang Anda dapat mengubah Anda person_id
membuat ulang kunci asing
EDIT: Menambahkan kunci di atas, berkat komentar
Saya telah menambahkan kunci tulis di atas
Semua pertanyaan penulisan di sesi lain selain sesi Anda sendiri (
INSERT, UPDATE, DELETE
) akan menunggu hingga batas waktu atauUNLOCK TABLES
; dieksekusihttp://dev.mysql.com/doc/refman/5.5/en/lock-tables.html
EDIT 2: OP meminta penjelasan yang lebih rinci tentang baris "Jenis dan definisi kolom kunci asing dan referensi harus sama. Ini berarti kunci asing Anda tidak mengizinkan perubahan jenis kolom Anda."
Dari Manual Referensi MySQL 5.5: Batasan KUNCI ASING
sumber
person_id
setelah melepaskan kunci asing? Sepertinya Anda tidak mengubah apa pun karena sudah menjadiSMALLINT UNSIGNED
.Anda dapat mematikan pemeriksaan kunci asing:
Harap pastikan untuk TIDAK menggunakan ini pada produksi dan memiliki cadangan.
sumber
SET FOREIGN_KEY_CHECKS
cakupan sesi (sesi lain masih akan menerapkan batasan FK). Itu sempurna untuk menambahkan / menghapusAUTO_INCREMENT
(yang tidak berubah yang sebenarnya kolom datatype), tetapi tidak akan bekerja jika Anda mencoba untuk mengubah kolom datatype untuk "nyata" (katakanlah, dari SMALLINT ke INT) karena Anda akan mendapatkan yang sah150 FK constraint incorrectly formed
saat mysql mencoba mengganti tabel lama dengan yang baru. Dalam kasus seperti itu, gunakan jawaban yang diterima.Ketika Anda mengatur kunci (primer atau asing) Anda menetapkan batasan tentang bagaimana mereka dapat digunakan, yang pada gilirannya membatasi apa yang dapat Anda lakukan dengan mereka. Jika Anda benar-benar ingin mengubah kolom, Anda dapat membuat ulang tabel tanpa batasan, meskipun saya merekomendasikan untuk tidak melakukannya. Secara umum, jika Anda memiliki situasi di mana Anda ingin melakukan sesuatu, tetapi terhalang oleh suatu kendala, paling baik diselesaikan dengan mengubah apa yang ingin Anda lakukan daripada dengan kendala.
sumber