2013-02-22 9 views
18

MySQL Workbench kamen mit der folgenden SQL-up eine Tabelle zu erstellen:MySQL Fehler 1022, wenn Tabelle erstellen

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 

, die ich gut aussieht, und es gibt ein paar andere sehr ähnliche Tabellen in meiner Datenbank, die von MySQL war glücklich, zu schaffen.

Aber dieses ...

ERROR 1022 (23000): Can't write; duplicate key in table 'errors_reports' 

Ich kann nicht für das Leben von mir sehen Sie alle doppelten Schlüssel hier. Es ist nur ein Schlüssel definiert!

Ich verwende MySQL 5.6 mit einer neuen Standardinstallation. Im Fehlerprotokoll ist nichts enthalten.

Ideen?

Edit: durch einen Prozess der Eliminierung (zurück auf die einfachste mögliche Definition der Tabelle geht, dann allmählich Bits zurück in das Hinzufügen) erscheint dieses Bit zu sein, das Problem:

CONSTRAINT `error_id` 
    FOREIGN KEY (`error_id`) 
    REFERENCES `mydb`.`errors` (`error_id`) 
    ON DELETE NO ACTION 
    ON UPDATE NO ACTION, 

die besonders ungerade ist als Es gibt identische Codes in mehreren anderen Tabellendefinitionen, und diese sind vollkommen in Ordnung!

+0

ich mit dieser Abfrage kein Problem haben .. scheint, als ob es etwas anderes passiert sein kann –

+0

Nicht sicher, dass Sie explizit einen Index für die FK-Spalten erstellen müssen. Ich hatte den Eindruck, dass das Erstellen der Referenz einen Index erzeugen würde. – Kermit

+0

Das Herausziehen der INDEX-Anweisungen macht keinen Unterschied. –

Antwort

-1

Verwenden Sie INSERT IGNORE anstelle von INSERT, wo INSERT IGNORE keine neue Zeile einfügen wird, wenn ein doppelter Primärschlüssel gefunden wird. Dies sollte helfen, das Problem vorübergehend zu lösen, aber ich würde empfehlen, die Tabelle zu kürzen.

+0

Dadurch wird die Tabelle erstellt und keine Daten eingefügt. Hier findet kein INSERT statt. –

+0

Rechts.Es ist definitiv das Problem mit dem Fremdschlüssel (Fehler 105 für mich). Stellen Sie sicher, dass der Fremdschlüssel und die referenzierte Spalte dieselben Datentypen haben, z. B. Sortierfolge, Standardattribute usw. –

2

Es scheint, dass Sie einen Index für die Fremdschlüsselspalten erstellen. Wenn Sie in InnoDb einen Fremdschlüssel erstellen, wird dieser automatisch erstellt.

See this thread.

+0

Der Code wurde von MySQL Workbench erzeugt, was das explizit hinzuzufügen scheint. Nicht, dass es einen Unterschied macht. –

+0

@MattMcLeod Können Sie die Einschränkungen erstellen, nachdem die Tabelle erstellt wurde? Können Sie auch [die Überprüfung der Indizes] (http://stackoverflow.com/a/5213364/679449) vor/nach der Erstellung der Tabelle durchführen? – Kermit

+1

Aha! Dies führte mich zu dem, was ich glaube, ist die Lösung: Eine andere Tabelle hatte bereits die gleiche Einschränkung re: error_id, und Workbench gab diesen beiden den gleichen Constraint-Namen. Durch Ändern des Constraint-Namens konnte er erstellt werden. –

59

Das Problem ist, dass der Name ein Fremdschlüssel nicht die gleichen wie eine anderer Fremdschlüssel im gesamten Modell sein kann.

Stellen Sie sich vor, diese Situation

Katalog -> Lieferant

Produkt -> Lieferant

, wenn der Name des Fremdschlüssels in der Tabelle Katalog für Anbieter ist „Lieferant“ und Ihnen zugewiesen das gleiche Name in der Produkttabelle, dann kollidieren die Namen der Fremdschlüssel.

Sie müssen sie anders nennen ..

Zum Beispiel:

catalog_supplier product_supplier

+0

Danke! Hatte das selbe Problem und konnte das angesichts der Fehlermassage nicht verstehen. BTW der Name des kollidierenden Fremdschlüssels ist nicht identisch mit dem Spaltennamen, nur ein interner MySql-Name für den Schlüssel. – uzilan

+2

das ist die Antwort! groß! –

+1

Wissen Sie, warum diese Einschränkung in MySQL existiert? – vipw