我在MySQL Workbench中创建了表,如下所示:
ORDRE表:
CREATE TABLE Ordre (
OrdreID INT NOT NULL,
OrdreDato DATE DEFAULT NULL,
KundeID INT DEFAULT NULL,
CONSTRAINT Ordre_pk PRIMARY KEY (OrdreID),
CONSTRAINT Ordre_fk FOREIGN KEY (KundeID) REFERENCES Kunde (KundeID)
)
ENGINE = InnoDB;
PRODUKT表:
CREATE TABLE Produkt (
ProduktID INT NOT NULL,
ProduktBeskrivelse VARCHAR(100) DEFAULT NULL,
ProduktFarge VARCHAR(20) DEFAULT NULL,
Enhetpris INT DEFAULT NULL,
CONSTRAINT Produkt_pk PRIMARY KEY (ProduktID)
)
ENGINE = InnoDB;
和 ORDRELINJE表:
CREATE TABLE Ordrelinje (
Ordre INT NOT NULL,
Produkt INT NOT NULL,
AntallBestilt INT DEFAULT NULL,
CONSTRAINT Ordrelinje_pk PRIMARY KEY (Ordre, Produkt),
CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID),
CONSTRAINT Ordrelinje_fk1 FOREIGN KEY (Produkt) REFERENCES Produkt (ProduktID)
)
ENGINE = InnoDB;
所以当我尝试将值插入ORDRELINJE
表时,我得到:
错误代码:1452。无法添加或更新子行:外键约束失败(
srdjank
。Ordrelinje
,CONSTRAINTOrdrelinje_fk
FOREIGN KEY(Ordre
)参考Ordre
(OrdreID
))
我已经看过关于这个主题的其他帖子,但没有运气。 我在监督某事或知道该怎么做?
答案 0 :(得分:125)
取自Using FOREIGN KEY Constraints
外键关系涉及一个包含该表的父表 中心数据值和具有相同值的子表 回到它的父母。 FOREIGN KEY子句在子节点中指定 表
它将拒绝任何尝试创建的INSERT或UPDATE操作 如果没有匹配项,则子表中的外键值 父表中的候选键值。
因此,您的错误Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
实际上意味着,您正在尝试向Ordrelinje
表中添加一行,Ordre
表中没有匹配的行(OrderID)。
您必须先将行插入Ordre
表格。
答案 1 :(得分:27)
您正在接受此约束检查,因为ordre表没有在insert命令中提供的引用顺序ID。
要在ordrelinje中插入值,首先必须在ordre表中输入值,并在orderlinje表中使用相同的ordreID。
或者您可以删除非空约束并在其中插入NULL值。
答案 2 :(得分:14)
您必须删除子表中没有任何相应外键值的数据到父表主键。或者从子表中删除所有数据,然后插入具有相同外键值的新数据作为主键。父表。这应该工作。 这里还有一个youtube video
答案 3 :(得分:9)
通常会发生此错误,因为在子表的引用字段中有一些值,而在父表的 reference / candidate 字段中不存在这些值。
有时候,当我们将外键约束应用于现有表时,已经有数据时,我们可能会遇到此错误。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选择。 在大多数情况下,我们将需要更新子表中的数据(而不是删除它们)。
现在,我们可以利用Left Join
在子表中查找所有那些在父表中没有匹配值的行。进行以下查询(缺少其他答案),将有助于获取这些不匹配的行:
SELECT child_table.*
FROM child_table
LEFT JOIN parent_table
ON parent_table.referenced_column = child_table.referencing_column
WHERE parent_table.referenced_column IS NULL
现在,您通常可以执行以下一个(或多个)步骤来修复数据。
null
。数据固定后,我们可以使用ALTER TABLE
语法应用外键约束。
答案 4 :(得分:6)
问题出在外键约束上。默认情况下(SET FOREIGN_KEY_CHECKS = 1)。 FOREIGN_KEY_CHECKS选项指定是否检查InnoDB表的外键约束。 MySQL - SET FOREIGN_KEY_CHECKS
我们可以在运行Query之前将外键检查设置为禁用。 Disable Foreign key。
在运行查询之前执行以下任一行,则可以成功运行查询。 :)
1)对于会话(推荐)
SET FOREIGN_KEY_CHECKS=0;
2)全球
SET GLOBAL FOREIGN_KEY_CHECKS=0;
答案 5 :(得分:3)
答案 6 :(得分:1)
在插入外键属性值时,首先验证属性类型以及父关系中的主键属性值,如果父关系中的值匹配,则可以轻松插入/更新子属性值。
答案 7 :(得分:1)
您应该将主表中REFERENCES KEY中的数据添加到儿童表中FOREIGN KEY中
这意味着不要将随机数据添加到外键,仅使用可访问的主键中的数据
答案 8 :(得分:1)
我有同样的问题。我在现有表上创建关系,但是具有不同的列值,这些列值被假定/假设是相关的。例如,我有一个表USERS
,该表的一个列USERID
包含行1,2,3,4,5
。然后,我有另一个子表ORDERS
,其中子表USERID
的行为1,2,3,4,5,6,7
。然后运行MySQl命令ALTER TABLE ORDERS ADD CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS(USERID) ON DELETE SET NULL ON UPDATE CASCADE;
它被以下消息拒绝了:
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails (DBNAME1.#sql-4c73_c0, CONSTRAINT ORDER_TO_USER_CONS FOREIGN KEY (ORDERUSERID) REFERENCES USERS (USERID) ON DELETE SET NULL ON UPDATE CASCADE)
我从ORDERS表中导出了数据,然后从中删除了所有数据,再次重新运行该命令,这次它可以正常工作了,然后从USERS表中重新插入了带有相应USERID
的数据。
答案 9 :(得分:1)
检查编号。父表中与子表匹配且主键也必须与外键引用匹配的记录集。 这对我有用。
答案 10 :(得分:0)
对于 PhpMyAdmin ,转到您创建外键的表的结构,然后单击关系视图,在删除下选择无操作< /strong> 和更新部分。 注意:这对我有用。 Docker image
答案 11 :(得分:0)
问题在于外键约束。默认情况下(SET FOREIGN_KEY_CHECKS = 1)。 FOREIGN_KEY_CHECKS 选项指定是否检查 InnoDB 表的外键约束。 MySQL - SET FOREIGN_KEY_CHECKS
我们可以在运行查询之前将外键检查设置为禁用。 Disable Foreign key。
在运行您的查询之前执行此行,然后您可以成功运行您的查询。 :)
=> SET FOREIGN_KEY_CHECKS=0;
答案 12 :(得分:0)
答案 13 :(得分:0)
我知道这个线程已经很长了,但是当我为类别表运行laravel种子时,它创建了一些奇怪的ID,分别是1、11、21、31,这导致我在尝试使用ID在另一个表中引用它时出错例如1、2、3 ...整天,直到我手动检查了数据库,
因此有时去查询数据库表以确保外部数据确实正确存在。
欢呼
答案 14 :(得分:0)
在我看来,表格是完全一致的。
无论如何,我都遇到了此错误,因为我在同一字段上偶然创建了多个FK约束。
我运行以下查询以显示所有键:
SELECT *
FROM information_schema.table_constraints
WHERE constraint_schema = 'my_db_name'
我用以下查询删除了错误的查询:
ALTER TABLE my_table
DROP FOREIGN KEY wrong_fk_constraint;
您还可以运行此查询来检查它:
SHOW CREATE TABLE my_table;
答案 15 :(得分:0)
首先在父表上允许NULL,然后将默认值设置为NULL。接下来创建外键关系。然后,您可以更新值以进行相应匹配
答案 16 :(得分:0)
发生此问题是因为在子表中插入了一些数据后,您在子表中设置了外键。
尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,这将起作用。
答案 17 :(得分:0)
即使我的父表具有我在子表中引用的所有值,我仍然遇到此问题。问题似乎是我无法将多个子引用添加到单个外键。换句话说,如果我有五行数据引用了相同的外键,那么MySQL只允许我上传第一行并给我错误1452。
对我有用的是键入代码“ SET GLOBAL FOREIGN_KEY_CHECKS = 0”。之后,我关闭了MySQL,然后重新启动它,然后就可以无错误地上传所有数据。然后我输入“ SET GLOBAL FOREIGN_KEY_CHECKS = 1”将系统设置回正常状态,尽管我不完全确定FOREIGN_KEY_CHECKS会做什么。希望这会有所帮助!
答案 18 :(得分:0)
使用外键时,插入的列顺序应相同。
例如,如果您要从 table2 向 table1 添加(userid, password)
,则从 table2 顺序应该是{{ 1}}和不喜欢 (userid, password)
,其中(password,userid)
是 table1 中 table2 中的外键 strong>。
答案 19 :(得分:0)
请把这挤在这里: 我的案例是尝试为某条存在的帖子创建一个赞; 提交数据库时出错。 解决方案是先创建帖子,然后再喜欢它。 根据我的理解,如果post_id要保存在likes表中,则必须先与posts表核对以确定存在性。 我觉得用这种方式更好,因为那样对我来说更合逻辑。
答案 20 :(得分:0)
具有不属于要关联的主键表的值,因此您必须先删除所有数据/根据主键中的值调整外键表的值键
答案 21 :(得分:0)
您应该在每个表中至少插入一个原始字符(您希望外键指向的表),然后您可以插入或更新外键的值
答案 22 :(得分:0)
您的ORDRELINJE
表使用外键约束ORDER
链接到constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
表,根据表Ordre int NOT NULL,
的{{1}}列必须与任何ORDRELINJE
匹配1}} Ordre int NOT NULL,
表的列。
现在发生的事情是,当您向ORDER
表中插入新行时,根据fk约束ORDRELINJE
,如果Ordrelinje_fk
是ORDER
,它正在检查OrdreID
表是否存在,因为它与任何OrderId不匹配,编译器正在抱怨外键违规。这就是您收到此错误的原因。
外键是您在任何表中用于在两者之间链接的另一个表的主键。此键由您在创建表时指定的外键约束绑定。对数据的任何操作都不得违反此约束。违反此约束可能会导致此类错误。
希望我说清楚。
答案 23 :(得分:-1)
您的问题的答案是您必须在主键和辅助键中设置相同的值。 谢谢
答案 24 :(得分:-2)
可以通过在父表中首先插入相应的记录来解决此问题,然后我们可以在子表的相应列中插入记录。还要检查列的数据类型和大小。它应与父表列相同,即使引擎和排序规则也应相同。 尝试这个!这就是我解决我问题的方法。如果不对,请纠正我。