数据库外键错误

时间:2014-08-28 22:55:15

标签: mysql database

我遇到了2张桌子的问题。

我刚刚创建了一个名为" ejemplar"使用以下SQL代码:

CREATE TABLE ejemplar 
(
id_revista INT NOT NULL,
id_ejemplar INT NOT NULL,
id_art  INT NOT NULL,
fecha_ejem VARCHAR (30),
precio_ejem decimal,
num_pag_ejem INT,
PRIMARY KEY (id_revista,id_ejemplar,id_art),
FOREIGN KEY (id_revista) REFERENCES revista (id_rev)
)

我想创建一个名为" ejem_art"使用以下SQL代码:

CREATE TABLE ejem_art(
id_rev INT NOT NULL,
id_ejem INT NOT NULL,
id_art INT NOT NULL,
num_pag INT,
PRIMARY KEY (id_rev,id_ejem,id_art),
FOREIGN KEY (id_rev) REFERENCES revista (id_rev),
FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar),
FOREIGN KEY (id_art) REFERENCES articulo (id_art)
);

DBMS是MySQL,你可以看到我在两个表的PK和FK字段中都有相同类型的数据。

当我尝试在创建表后运行第二个SQL代码" ejemplar" MySQL显示着名的errno:150,它涉及不同类型的数据甚至是不同的引擎,而不是InnoDB。

我已经确定两件事情都是正确的(相同的数据类型和相同的引擎),但我仍然无法运行第二个代码。

希望你能帮助我,因为我不想做一个" Alter Table"只是因为这个错误。

提前致谢!

1 个答案:

答案 0 :(得分:1)

您在外键中引用的列必须是父表的键中的最左侧列。

CREATE TABLE parent ( A INT, B INT, PRIMARY KEY (A,B) );

CREATE TABLE child (B INT, FOREIGN KEY (B) REFERENCES parent(B) ); /* WRONG */

CREATE TABLE child (A INT, FOREIGN KEY (A) REFERENCES parent(A) ); /* RIGHT */

重新评论:

在表中定义列的顺序并不重要。在PRIMARY KEY约束中列出列的顺序很重要。外键只能引用父键的最左列。

在您的父表中,您有以下主键:

PRIMARY KEY (id_revista,id_ejemplar),

id_revista位于最左侧。 id_ejemplar不是最左边的

因此子表的外键不能这样做:

FOREIGN KEY (id_ejem) REFERENCES ejemplar (id_ejemplar), /* WRONG */

最好的解决方案是引用id_revista和id_ejemplar。然后,您将从最左侧开始引用父级主键的一组列。

FOREIGN KEY (id_rev, id_ejem) REFERENCES ejemplar (id_revista, id_ejemplar),