MySQL:创建带有两个外键的表失败,出现“重复键名”错误。

13

在尝试创建一个新表时,MySQL 给了我一个我无法解释的错误。

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

这个查询失败了,错误信息是ERROR 1061 (42000): Duplicate key name 'WarehouseMovements'。如果我移除外键约束,查询就能成功,但我希望确保product1和product2实际上指向某个地方。

默认的存储引擎是InnoDB。

这个查询有什么问题?

3个回答

13

尝试使外键名称不同:

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

更新

那是一个索引或外键名称,不是表名。请参见创建表外键文档

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

该段内容解释:

index_name 代表外键 ID。如果已经明确定义了外键的索引,那么此参数将被忽略。否则,如果 MySQL 需要为外键创建索引,它将使用 index_name 作为索引名称。


1
我以为应该在括号前面放表名...哦,谢谢!这个方法可行。 - Georgios Bitzes
@GiorgosBitzes 我添加了一个参考,其中描述了语法。有几种做法。您还将看到FK_名称前缀。 - criticalfix

6

您必须使用不同的名称为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;

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接