Rumah > pangkalan data > tutorial mysql > Mengapakah saya mendapat ralat \'Pelanggaran Kekangan Kunci Pendua\' (Ralat 1022) dalam MySQL?

Mengapakah saya mendapat ralat \'Pelanggaran Kekangan Kunci Pendua\' (Ralat 1022) dalam MySQL?

Barbara Streisand
Lepaskan: 2024-11-03 16:54:03
asal
447 orang telah melayarinya

Why am I getting a

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>
Salin selepas log masuk

Setelah dilaksanakan, pertanyaan ini gagal dengan ralat berikut:

<code class="sql">ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports'</code>
Salin selepas log masuk

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>
Salin selepas log masuk

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!

sumber:php.cn
Kenyataan Laman Web ini
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn
Artikel terbaru oleh pengarang
Tutorial Popular
Lagi>
Muat turun terkini
Lagi>
kesan web
Kod sumber laman web
Bahan laman web
Templat hujung hadapan