Saya mendapatkan kesalahan 1022 tentang kunci duplikat pada perintah membuat tabel. Setelah melihat kueri, saya tidak bisa mengerti di mana duplikasi itu terjadi. Adakah yang bisa melihatnya?
SQL query:
-- -----------------------------------------------------
-- Table `apptwo`.`usercircle`
-- -----------------------------------------------------
CREATE TABLE IF NOT EXISTS `apptwo`.`usercircle` (
`idUserCircle` MEDIUMINT NOT NULL ,
`userId` MEDIUMINT NULL ,
`circleId` MEDIUMINT NULL ,
`authUser` BINARY NULL ,
`authOwner` BINARY NULL ,
`startDate` DATETIME NULL ,
`endDate` DATETIME NULL ,
PRIMARY KEY ( `idUserCircle` ) ,
INDEX `iduser_idx` ( `userId` ASC ) ,
INDEX `idcategory_idx` ( `circleId` ASC ) ,
CONSTRAINT `iduser` FOREIGN KEY ( `userId` ) REFERENCES `apptwo`.`user` (
`idUser`
) ON DELETE NO ACTION ON UPDATE NO ACTION ,
CONSTRAINT `idcategory` FOREIGN KEY ( `circleId` ) REFERENCES `apptwo`.`circle` (
`idCircle`
) ON DELETE NO ACTION ON UPDATE NO ACTION
) ENGINE = INNODB;
MySQL said: Documentation
#1022 - Can't write; duplicate key in table 'usercircle'
ON DELETE NO ACTION
hanya akan menjatuhkan seluruh penggunaan kunci asing. Kecuali Anda memiliki alasan yang sangat spesifik untuk melakukan itu.Jawaban:
Kemungkinan besar Anda sudah memiliki batasan dengan nama
iduser
atauidcategory
dalam database Anda. Ganti nama kendala jika demikian.Kendala harus unik untuk seluruh database, bukan hanya untuk tabel spesifik yang Anda buat / ubah.
Untuk mengetahui di mana kendala saat ini digunakan, Anda dapat menggunakan pertanyaan berikut:
sumber
Ubah nama kunci Asing di MySQL. Anda tidak dapat memiliki nama kunci asing yang sama di tabel database.
Periksa semua tabel Anda dan semua kunci asing Anda dan hindari memiliki dua kunci asing dengan nama persis yang sama.
sumber
Dari dua tautan yang Diselesaikan dengan Sukses dan Penamaan Konvensi , saya dengan mudah menyelesaikan masalah yang sama yang saya hadapi. yaitu, untuk nama kunci asing, berikan sebagai fk _colName_ TableName . Konvensi penamaan ini tidak ambigu dan juga membuat setiap ForeignKey dalam Model DB Anda unik dan Anda tidak akan pernah mendapatkan kesalahan ini.
sumber
Seperti yang telah disebutkan orang lain, mungkin nama untuk kendala Anda sudah digunakan oleh tabel lain di DB Anda . Mereka harus unik di seluruh basis data.
Konvensi yang bagus untuk menyebutkan batasan kunci asing adalah:
Untuk menyelidiki apakah ada kemungkinan bentrokan, Anda bisa mendaftar semua kendala yang digunakan oleh database Anda dengan pertanyaan ini:
Ketika saya menjalankan kueri ini, saya menemukan saya sebelumnya membuat salinan sementara dari sebuah tabel dan salinan ini sudah menggunakan nama kendala yang saya coba gunakan.
sumber
Saya hanya menghabiskan 4 jam terakhir dengan masalah yang sama. Apa yang saya lakukan adalah memastikan batasannya memiliki nama yang unik.
Anda dapat mengubah nama batasannya. Saya menambahkan nomor untuk saya sehingga saya dapat dengan mudah melacak jumlah kejadian.
Contoh
Jika batasan dalam tabel bernama boy dengan kunci asing X Batasan berikutnya dengan kunci asing X dapat disebut boy1
Saya yakin Anda akan mengetahui nama yang lebih baik daripada saya. 🙂
sumber
Ini juga dapat muncul sehubungan dengan bug di versi tertentu alat perubahan skema-online Percona Toolkit. Untuk bermutasi tabel besar, pt-osc pertama-tama membuat tabel duplikat dan menyalin semua catatan ke dalamnya. Dalam beberapa keadaan, beberapa versi pt-osc 2.2.x akan mencoba memberi batasan pada tabel baru nama yang sama dengan batasan pada tabel lama.
Perbaikan dirilis pada 2.3.0.
Lihat https://bugs.launchpad.net/percona-toolkit/+bug/1498128 untuk lebih jelasnya.
sumber
Saya juga mengalami masalah itu. Periksa apakah nama database sudah ada di Mysql, dan ganti nama yang lama.
sumber
Saya punya masalah ini saat membuat tabel baru. Ternyata nama Kunci Asing yang saya berikan sudah digunakan. Mengganti nama kunci memperbaikinya.
sumber