Pelanggaran Kekangan Kunci Pendua dalam MySQL: Ralat 1022
MySQL Workbench menjana kod SQL berikut untuk mencipta jadual:
<code class="sql">CREATE TABLE IF NOT EXISTS `mydb`.`errors_reports` ( `error_id` INT NOT NULL , `report_short` VARCHAR(15) NOT NULL , PRIMARY KEY (`error_id`, `report_short`) , INDEX `error_id_idx` (`error_id` ASC) , INDEX `report_short_idx` (`report_short` ASC) , CONSTRAINT `error_id` FOREIGN KEY (`error_id` ) REFERENCES `mydb`.`errors` (`error_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `report_short` FOREIGN KEY (`report_short` ) REFERENCES `mydb`.`reports` (`report_short` ) ON DELETE NO ACTION ON UPDATE NO ACTION) ENGINE = InnoDB</code>
Setelah dilaksanakan, pertanyaan ini gagal dengan ralat berikut:
<code class="sql">ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'</code>
Analisis
Pada mulanya, definisi kunci utama kelihatan sah, kerana hanya terdapat satu kunci utama ditakrifkan. Walau bagaimanapun, isunya terletak pada nama kekangan kunci asing (id_error dan report_short).
Resolusi
MySQL tidak membenarkan kekangan kunci asing untuk mempunyai nama yang sama dalam keseluruhan pangkalan data. Memandangkan table errors_reports mempunyai dua kekangan kunci asing yang merujuk kepada jadual lain, adalah perlu untuk memastikan bahawa nama kekangannya adalah unik.
Untuk menyelesaikan ralat, namakan semula satu atau kedua-dua kekangan kunci asing. Contohnya, bukannya "error_id", ia boleh dinamakan "error_id_ref".
Contoh
<code class="sql">CONSTRAINT `error_id_ref` FOREIGN KEY (`error_id` ) REFERENCES `mydb`.`errors` (`error_id` ) ON DELETE NO ACTION ON UPDATE NO ACTION, CONSTRAINT `report_short_ref` FOREIGN KEY (`report_short` ) REFERENCES `mydb`.`reports` (`report_short` ) ON DELETE NO ACTION ON UPDATE NO ACTION)</code>
Ringkasan
Apabila menghadapi ralat MySQL 1022 yang berkaitan dengan kunci pendua, adalah penting untuk mengesahkan bukan sahaja definisi kunci utama tetapi juga nama bagi sebarang kekangan kunci asing. Memastikan bahawa kekangan ini mempunyai nama yang unik akan menghalang ralat daripada berlaku.
Atas ialah kandungan terperinci Mengapakah saya mendapat ralat 'Pelanggaran Kekangan Kunci Pendua' (Ralat 1022) dalam MySQL?. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!