2013-05-22 22 views
5

Podczas próby utworzenia nowej tabeli, MySQL daje mi błąd, którego nie potrafię wyjaśnić.MySQL: Tworzenie tabeli z dwoma kluczami obcymi nie powiedzie się z błędem "Zduplikowana nazwa klucza"

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) 
); 

Nie powiedzie się to z ERROR 1061 (42000): Duplicate key name 'WarehouseMovements'. Jeśli usuniemy ograniczenia klucza obcego, to się uda, ale chcę się upewnić, że produkt 1 i produkt 2 faktycznie wskazują gdzieś.

Domyślnym silnikiem jest InnoDB.

Co jest nie tak z zapytaniem?

Odpowiedz

5

spróbuj nazwy FK odrębny:

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

To indeks lub nazwa FK, a nie nazwa tabeli. Zobacz create-table-foreign-keys documentation:

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

który mówi

index_name reprezentuje identyfikator klucza obcego. Jeśli zostanie podany, zostanie to zignorowane, jeśli indeks dla klucza obcego jest zdefiniowany jawnie. W przeciwnym razie, jeśli MySQL tworzy indeks dla klucza obcego, używa on nazwy indeksu dla nazwy indeksu .

+0

byłem pod wrażeniem Miałem umieścić nazwę tabeli przed nawiasami ... Huh. Dzięki! To zadziałało. –

+0

@GiorgosBitzes Dodałem odwołanie, w którym opisano składnię. Istnieje kilka sposobów na zrobienie tego. Zobaczysz także przedrostki nazw FK_. – criticalfix

3

musisz dodać wiązanie z różnymi nazwami do FK

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; 
Powiązane problemy