Errore 1022 - Impossibile scrivere; chiave duplicata nella tabella


218

Ricevo un errore 1022 per quanto riguarda le chiavi duplicate sul comando create table. Dopo aver esaminato la query, non riesco a capire dove si stia verificando la duplicazione. Qualcun altro può vederlo?

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' 

4
Se ricordo bene, la chiave primaria è sempre anche un INDICE UNICO, quindi dovresti eliminare l'istruzione indice univoca?
Mr47,

1
ON DELETE NO ACTIONeliminerebbe semplicemente l'intero uso della chiave esterna. A meno che tu non abbia motivi molto specifici per farlo.
AmazingDreams,

4
@AmazingDreams Perché? Fa ancora rispettare l'integrità referenziale. Solo tu devi eliminare i bambini da solo. Questo è più sicuro di un'eliminazione a cascata in cui è possibile eliminare accidentalmente molti dati eliminando una parola chiave errata.
GolezTrol,

1
stackoverflow.com/a/5810024/1567737 Perché usare un alias quando si usa 'alias' chiarisce immediatamente lo scopo?
AmazingDreams,

@AmazingDreams Grazie per il suggerimento. Mi piace anche il dibattito al riguardo - mi aiuta a conoscere i pro e i contro.
Abilitabile dal

Risposte:


534

Molto probabilmente hai già un vincolo con il nome idusero idcategorynel tuo database. In tal caso, basta rinominare i vincoli.

I vincoli devono essere univoci per l'intero database, non solo per la tabella specifica che si sta creando / modificando.

Per scoprire dove sono attualmente in uso i vincoli è possibile utilizzare la seguente query:

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');

15
Esattamente come hai detto. Molti vincoli sono stati generati automaticamente con gli stessi nomi di idcategory nel resto della query CREATE - grazie per l'aiuto!
Abilitabile dal

1
Ho pensato che MySQL Workbench avrebbe risolto questo problema quando esportavo lo script di creazione, ma è quello che ottengo per "Ignora" ingenendo l'avvertimento su questo genere di cose quando ho aperto il progetto.
SnowInferno,

Grazie, amico :) Questo mi aiuta molto e ora la mia convenzione per le chiavi esterne è diversa e non posso più incontrare questo problema :)

Lo posso confermare. Ma cosa posso fare se il vincolo indicato esiste anche se la tabella di riferimento è già stata eliminata ?? Posso eliminare un vincolo da una tabella inesistente? Immagino che dovrei aggiornare da MySQL 5.6 all'attuale MariaDB.
Anse,

3
Grazie per questo: i vincoli devono essere univoci per l'intero database
sebasira

31

Modifica il nome della chiave esterna in MySQL. Non è possibile avere gli stessi nomi di chiave esterna nelle tabelle del database.

Controlla tutti i tuoi tavoli e tutte le tue chiavi esterne ed evita di avere due chiavi esterne con lo stesso nome esatto.


Questo è stato il problema nel mio caso. Non l'avrei mai immaginato e mi hai salvato la giornata. Usando fk_id_1, fk_id_2 ecc., Ora. Grazie.
JackLeEmmerdeur il

15

Dai due collegamenti Risolti con successo e Convenzione sui nomi , ho facilmente risolto lo stesso problema che ho dovuto affrontare. cioè, per il nome della chiave esterna, dare come fk _colName_ TableName . Questa convenzione di denominazione non è ambigua e rende ogni singolo tasto ForeignKey nel tuo modello DB unico e non otterrai mai questo errore.

Errore 1022: impossibile scrivere; chiave duplicata nella tabella


6

Come altri hanno già detto, è possibile che il nome del vincolo sia già utilizzato da un'altra tabella nel proprio DB . Devono essere univoci in tutto il database.

Una buona convenzione per la denominazione dei vincoli di chiave esterna è:

fk_TableName_ColumnName

Per verificare se esiste un possibile scontro, puoi elencare tutti i vincoli utilizzati dal tuo database con questa query:

SELECT * FROM information_schema.table_constraints WHERE constraint_schema = 'YOUR_DB';

Quando ho eseguito questa query, ho scoperto di aver precedentemente creato una copia temporanea di una tabella e questa copia stava già utilizzando il nome del vincolo che stavo tentando di utilizzare.


4

Ho appena trascorso le ultime 4 ore con lo stesso problema. Quello che ho fatto è stato semplicemente assicurarmi che i vincoli avessero nomi univoci.

È possibile rinominare i vincoli. Ho aggiunto un numero al mio in modo da poter facilmente rintracciare il numero di occorrenze.

Esempio

Se un vincolo in una tabella è denominato boy con una chiave esterna X Il successivo vincolo con la chiave esterna X può essere chiamato boy1

Sono sicuro che avresti trovato nomi migliori di me. 🙂


3

Ciò può verificarsi anche in relazione a un bug in alcune versioni dello strumento di modifica dello schema online di Percona Toolkit. Per mutare una tabella di grandi dimensioni, pt-osc crea prima una tabella duplicata e copia tutti i record in essa contenuti. In alcune circostanze, alcune versioni di pt-osc 2.2.x tenteranno di assegnare ai vincoli della nuova tabella gli stessi nomi dei vincoli della vecchia tabella.

Una correzione è stata rilasciata in 2.3.0.

Vedi https://bugs.launchpad.net/percona-toolkit/+bug/1498128 per maggiori dettagli.


1

Ho riscontrato anche questo problema. Verifica se il nome del database esiste già in Mysql e rinomina il vecchio.


1

Ho avuto questo problema durante la creazione di una nuova tabella. Si scopre che il nome della chiave esterna che ho dato era già in uso. La ridenominazione della chiave l'ha risolta.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.