gpt4 book ai didi

mysql - 数据库外键错误

转载 作者:行者123 更新时间:2023-11-29 12:45:07 25 4
gpt4 key购买 nike

我在使用 2 个表时遇到问题。

我刚刚使用以下 SQL 代码创建了一个名为“ejemplar”的表:

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

我想使用以下 SQL 代码创建一个名为“ejem_art”的表:

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 字段中的数据类型相同。

当我在创建表“ejemplar”后尝试运行第二个 SQL 代码时,MySQL 显示了著名的 errno: 150,它与不同类型的数据甚至不同的引擎而不是 InnoDB 相关。

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

希望你能帮助我解决这个问题,因为我不想仅仅因为这个错误就创建一个“Alter Table”。

提前致谢!

最佳答案

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

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

关于mysql - 数据库外键错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25559256/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com