12

在尝试创建新表时,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。

查询有什么问题?

4

3 回答 3

12

尝试使 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,

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

更新

那是索引或 FK 名称,而不是表名称。请参阅create-table-foreign-keys 文档

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

哪个说

index_name 表示外键 ID。如果给定,如果明确定义了外键的索引,则忽略它。否则,如果 MySQL 为外键创建索引,它使用 index_name 作为索引名称。

于 2013-05-22T19:27:34.337 回答
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)
);
于 2013-05-22T19:30:25.957 回答
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;
于 2015-09-28T10:10:09.700 回答