Fehler 1022 - Kann nicht schreiben; doppelter Schlüssel in der Tabelle

218

Beim Befehl create table wird ein 1022-Fehler bezüglich doppelter Schlüssel angezeigt. Nachdem ich mir die Abfrage angesehen habe, kann ich nicht verstehen, wo die Vervielfältigung stattfindet. Kann es noch jemand sehen?

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' 
Git-fähig
quelle
4
Wenn ich mich richtig erinnere, ist der Primärschlüssel immer auch ein EINZIGARTIGER INDEX, sodass Sie die eindeutige Indexanweisung löschen müssten.
Mr47
1
ON DELETE NO ACTIONwürde einfach die gesamte Verwendung des Fremdschlüssels fallen lassen. Es sei denn, Sie haben ganz bestimmte Gründe dafür.
AmazingDreams
4
@AmazingDreams Warum? Es erzwingt weiterhin die referenzielle Integrität. Nur Sie müssen die Kinder selbst löschen. Dies ist sicherer als ein kaskadiertes Löschen, bei dem Sie versehentlich viele Daten löschen könnten, indem Sie ein falsches Schlüsselwort löschen.
GolezTrol
1
stackoverflow.com/a/5810024/1567737 Warum die Verwendung eines Alias ​​bei Verwendung des "Alias" macht den Zweck sofort klar?
AmazingDreams
@AmazingDreams Danke für den Tipp. Ich mag auch die Debatte darüber - es hilft mir, die Vor- und Nachteile kennenzulernen.
Git-fähig

Antworten:

534

Höchstwahrscheinlich haben Sie bereits eine Einschränkung mit dem Namen iduseroder idcategoryin Ihrer Datenbank. Benennen Sie die Einschränkungen einfach um, wenn dies der Fall ist.

Einschränkungen müssen für die gesamte Datenbank eindeutig sein, nicht nur für die spezifische Tabelle, die Sie erstellen / ändern.

Um herauszufinden, wo die Einschränkungen derzeit verwendet werden, können Sie die folgende Abfrage verwenden:

SELECT `TABLE_SCHEMA`, `TABLE_NAME`
FROM `information_schema`.`KEY_COLUMN_USAGE`
WHERE `CONSTRAINT_NAME` IN ('iduser', 'idcategory');
Maksym Polshcha
quelle
15
Genau wie du gesagt hast. Viele Einschränkungen wurden im Rest der CREATE-Abfrage automatisch mit denselben IDcategory-IDuser-Namen generiert - danke für Ihre Hilfe!
Git-fähig
1
Ich dachte, MySQL Workbench hätte dies beim Exportieren des Erstellungsskripts behoben, aber das ist es, was ich bekomme, wenn ich die Warnung über solche Dinge beim Öffnen des Projekts "ignoriere".
SnowInferno
Vielen Dank, Kumpel :) Das hilft mir sehr und jetzt ist meine Konvention für Fremdschlüssel anders und ich kann dieses Problem nicht wieder
Kann das bestätigen. Aber was kann ich tun, wenn die benannte Einschränkung vorhanden ist, obwohl die referenzierte Tabelle bereits gelöscht wurde? Kann ich eine Einschränkung aus einer nicht vorhandenen Tabelle löschen? Ich denke, ich sollte von MySQL 5.6 auf die aktuelle MariaDB aktualisieren.
Anse
3
Vielen Dank dafür: Einschränkungen müssen für die gesamte Datenbank eindeutig sein
sebasira
31

Ändern Sie den Fremdschlüsselnamen in MySQL. Sie können nicht dieselben Fremdschlüsselnamen in den Datenbanktabellen haben.

Überprüfen Sie alle Ihre Tabellen und alle Fremdschlüssel und vermeiden Sie zwei Fremdschlüssel mit demselben genauen Namen.

Wassim Sabra
quelle
Das war das Problem in meinem Fall. Ich hätte es nie gedacht und du hast meinen Tag gerettet. Verwenden Sie jetzt fk_id_1, fk_id_2 usw. Vielen Dank.
JackLeEmmerdeur
15

Über die beiden Links " Erfolgreich gelöst" und " Namenskonvention" konnte ich das gleiche Problem, mit dem ich konfrontiert war, leicht lösen. Geben Sie für den Fremdschlüsselnamen fk _colName_ TableName an . Diese Namenskonvention ist nicht mehrdeutig und macht auch jeden ForeignKey in Ihrem DB-Modell einzigartig, und Sie werden diesen Fehler nie erhalten.

Fehler 1022: Kann nicht schreiben; doppelter Schlüssel in der Tabelle

Chandz
quelle
6

Wie bereits erwähnt, wird der Name für Ihre Einschränkung möglicherweise bereits von einer anderen Tabelle in Ihrer Datenbank verwendet . Sie müssen in der gesamten Datenbank eindeutig sein.

Eine gute Konvention zum Benennen von Fremdschlüsseleinschränkungen ist:

fk_TableName_ColumnName

Um zu untersuchen, ob ein möglicher Konflikt vorliegt, können Sie alle von Ihrer Datenbank verwendeten Einschränkungen mit dieser Abfrage auflisten:

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

Als ich diese Abfrage ausführte, stellte ich fest, dass ich zuvor eine temporäre Kopie einer Tabelle erstellt hatte und diese Kopie bereits den Einschränkungsnamen verwendete, den ich verwenden wollte.

Simon East
quelle
4

Ich habe gerade die letzten 4 Stunden mit dem gleichen Problem verbracht. Ich habe einfach sichergestellt, dass die Einschränkungen eindeutige Namen haben.

Sie können die Einschränkungen umbenennen. Ich habe eine Nummer an meine angehängt, damit ich die Anzahl der Vorkommen leicht verfolgen kann.

Beispiel

Wenn eine Einschränkung in einer Tabelle als Junge mit einem Fremdschlüssel X bezeichnet wird, kann die nächste Einschränkung mit dem Fremdschlüssel X als Junge1 bezeichnet werden

Ich bin sicher, Sie würden bessere Namen finden als ich. 🙂

Unbekanntes Skript
quelle
3

Dies kann auch im Zusammenhang mit einem Fehler in bestimmten Versionen des Online-Schemaänderungstools von Percona Toolkit auftreten. Um eine große Tabelle zu mutieren, erstellt pt-osc zunächst eine doppelte Tabelle und kopiert alle Datensätze in diese. Unter bestimmten Umständen versuchen einige Versionen von pt-osc 2.2.x, den Einschränkungen für die neue Tabelle dieselben Namen zu geben wie den Einschränkungen für die alte Tabelle.

Ein Fix wurde in 2.3.0 veröffentlicht.

Weitere Informationen finden Sie unter https://bugs.launchpad.net/percona-toolkit/+bug/1498128 .

MJD
quelle
1

Ich bin auch auf dieses Problem gestoßen. Überprüfen Sie, ob der Datenbankname bereits in MySQL vorhanden ist, und benennen Sie den alten um.


quelle
1

Ich hatte dieses Problem beim Erstellen einer neuen Tabelle. Es stellt sich heraus, dass der von mir angegebene Fremdschlüsselname bereits verwendet wurde. Das Umbenennen des Schlüssels hat das Problem behoben.

user3076750
quelle