在尝试创建新表时,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)
);
Run Code Online (Sandbox Code Playgroud)
这失败了ERROR 1061 (42000): Duplicate key name 'WarehouseMovements'.如果我删除外键约束成功,但我想确保product1和product2实际上指向某个地方.
默认引擎是InnoDB.
查询有什么问题?
尝试使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)
);
Run Code Online (Sandbox Code Playgroud)
UPDATE
这是索引或FK名称,而不是表名.请参阅create-table-foreign-keys文档:
[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
Run Code Online (Sandbox Code Playgroud)
哪个说
index_name表示外键ID.如果给定,则在显式定义外键的索引时忽略该值.否则,如果MySQL为外键创建索引,则它将index_name用于索引名称.
您必须向 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)
);
Run Code Online (Sandbox Code Playgroud)