Saya perlu mengubah database saya yang ada untuk menambahkan kolom. Karenanya saya juga ingin memperbarui bidang UNIQUE untuk mencakup kolom baru itu. Saya mencoba untuk menghapus indeks saat ini tetapi tetap mendapatkan kesalahanMySQL Cannot drop index needed in a foreign key constraint
CREATE TABLE mytable_a (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE mytable_b (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE mytable_c (
ID TINYINT NOT NULL AUTO_INCREMENT PRIMARY KEY,
Name VARCHAR(255) NOT NULL,
UNIQUE(Name)
) ENGINE=InnoDB;
CREATE TABLE `mytable` (
`ID` int(11) NOT NULL AUTO_INCREMENT,
`AID` tinyint(5) NOT NULL,
`BID` tinyint(5) NOT NULL,
`CID` tinyint(5) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `AID` (`AID`,`BID`,`CID`),
KEY `BID` (`BID`),
KEY `CID` (`CID`),
CONSTRAINT `mytable_ibfk_1` FOREIGN KEY (`AID`) REFERENCES `mytable_a` (`ID`) ON DELETE CASCADE,
CONSTRAINT `mytable_ibfk_2` FOREIGN KEY (`BID`) REFERENCES `mytable_b` (`ID`) ON DELETE CASCADE,
CONSTRAINT `mytable_ibfk_3` FOREIGN KEY (`CID`) REFERENCES `mytable_c` (`ID`) ON DELETE CASCADE
) ENGINE=InnoDB;
mysql> ALTER TABLE mytable DROP INDEX AID;
ERROR 1553 (HY000): Cannot drop index 'AID': needed in a foreign key constraint
UNIQUE KEY AID
pada mytable?Jawaban:
Anda harus menjatuhkan kunci asing. Kunci asing di MySQL secara otomatis membuat indeks di atas meja (Ada pertanyaan SO pada topik).
sumber
mytable
ADD CONSTRAINTmytable_ibfk_1
FOREIGN KEY (AID
) REFERENSImytable_a
(ID
) PADA DELETE CASCADE;FOREIGN KEY
kendala saya anonim?Langkah 1
Daftar kunci asing (CATATAN yang berbeda dengan nama indeks)
Hasilnya akan menunjukkan kepada Anda nama kunci asing.
Format:
Langkah 2
Kunci Drop (Asing / primer / kunci)
Langkah 3
Jatuhkan indeks.
sumber
Jika Anda bermaksud melakukan ini:
Tapi kemudian:
memberi kesalahan.
Anda dapat menjatuhkan indeks dan membuat yang baru dalam satu
ALTER TABLE
pernyataan:sumber
Karena Anda harus memiliki indeks pada bidang kunci asing, Anda cukup membuat indeks sederhana di bidang 'AID'
dan hanya kemudian menjatuhkan indeks unik 'AID'
sumber
Kunci asing selalu membutuhkan indeks. Tanpa indeks yang menegakkan kendala akan membutuhkan pemindaian tabel penuh pada tabel referensi untuk setiap kunci yang dimasukkan atau diperbarui dalam tabel referensi. Dan itu akan memiliki dampak kinerja yang tidak dapat diterima. Ini memiliki 2 konsekuensi sebagai berikut:
sumber
Saya pikir ini cara mudah untuk menjatuhkan indeks.
sumber
FOREIGN_KEY_CHEK=0
dan pada akhirnyaFOREIGN_KEY_CHEK=1
.Dalam kasus saya, saya menjatuhkan kunci asing dan saya masih tidak bisa menjatuhkan indeks. Itu karena ada meja lain yang memiliki kunci asing untuk tabel ini di bidang yang sama. Setelah saya menjatuhkan kunci asing di meja lain saya bisa menjatuhkan indeks di tabel ini.
sumber
jika Anda ingin menjatuhkan kolom kunci Asing (penyihir memegang batasan) Anda harus menjatuhkan kunci asing terlebih dahulu kemudian menjatuhkan kolom, ketika Anda menjatuhkan kunci asing, Anda tidak harus melewati semua nama, cukup lewat kunci Asing nama kolom:
lebih detail tentang:
https://laravel.com/docs/6.x/migrations#foreign-key-constraints
sumber