2013-05-22 7 views
5

Beim Versuch, eine neue Tabelle zu erstellen, gibt MySQL mir einen Fehler, den ich nicht erklären kann.MySQL: Das Erstellen einer Tabelle mit zwei Fremdschlüsseln schlägt mit dem Fehler "Doppelter Schlüsselname" fehl

CREATE TABLE Products (
    id INT NOT NULL, 
    PRIMARY KEY(id) 
); 

CREATE TABLE WarehouseMovements (
    time  DATETIME   NOT NULL, 
    product1 INT    NOT NULL, 
    product2 INT    NOT NULL, 

    FOREIGN KEY WarehouseMovements(product1) REFERENCES Products(id), 
    FOREIGN KEY WarehouseMovements(product2) REFERENCES Products(id) 
); 

Dies schlägt mit ERROR 1061 (42000): Duplicate key name 'WarehouseMovements' fehl. Wenn ich die Fremdschlüsseleinschränkungen entferne, ist dies erfolgreich, aber ich möchte sicherstellen, dass product1 und product2 tatsächlich auf irgendwoher verweisen.

Standard-Engine ist InnoDB.

Was ist falsch an der Abfrage?

Antwort

5

Versuchen Sie, die FK Namen verschieden machen:

CREATE TABLE Products (
    id INT NOT NULL, 
    PRIMARY KEY(id) 
); 

CREATE TABLE WarehouseMovements (
    time  DATETIME   NOT NULL, 
    product1 INT    NOT NULL, 
    product2 INT    NOT NULL, 

    FOREIGN KEY IX_WarehouseMovements_product1(product1) REFERENCES Products(id), 
    FOREIGN KEY IX_WarehouseMovements_product2(product2) REFERENCES Products(id) 
); 

UPDATE

Das ist ein Index oder FK Name, kein Name-Tabelle. Siehe create-table-foreign-keys documentation:

[CONSTRAINT [symbol]] FOREIGN KEY 
[index_name] (index_col_name, ...) 
REFERENCES tbl_name (index_col_name,...) 

Welche sagt

index_name einen Fremdschlüssel-ID darstellt. Wenn angegeben, wird dies ignoriert, wenn ein Index für den Fremdschlüssel explizit definiert ist. Andernfalls, wenn MySQL einen Index für den Fremdschlüssel erstellt, verwendet es index_name für den Indexnamen .

+0

Ich hatte den Eindruck, ich sollte den Namen der Tabelle vor den Klammern setzen ... Huh. Vielen Dank! Das hat funktioniert. –

+0

@GiorgosBitzes Ich habe eine Referenz hinzugefügt, wo die Syntax beschrieben wird. Es gibt ein paar Möglichkeiten, dies zu tun. Sie sehen auch FK_ Name Präfixe. – criticalfix

3

Sie müssen Constraint mit unterschiedlichen Namen zu FK hinzufügen

CREATE TABLE Products (
    id INT NOT NULL, 
    PRIMARY KEY (id) 
); 

CREATE TABLE WarehouseMovements (
    time DATETIME NOT NULL, 
    product1 INT NOT NULL, 
    product2 INT NOT NULL, 
    CONSTRAINT fk_product_1 FOREIGN KEY (product1) REFERENCES Products (id), 
    CONSTRAINT fk_product_2 FOREIGN KEY (product2) REFERENCES Products (id) 
); 
0
ALTER TABLE `cca_orders` 
ADD CONSTRAINT `item_id` 
FOREIGN KEY (`item_id`) 
REFERENCES `joshi_textile_db`.`cca_items_master`(`id`) 
ON DELETE RESTRICT 
ON UPDATE RESTRICT; 
Verwandte Themen