我遇到了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"只是因为这个错误。
提前致谢!
答案 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),