我在 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;
产品表:
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,CONSTRAINT Ordrelinje_fk FOREIGN KEY (Ordre) REFERENCES Ordre (OrdreID))
我看过关于这个主题的其他帖子,但没有运气。我是否在监督某事或知道该怎么做?
取自 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
表中。
问题在于外键约束。默认情况下(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;
出现这个错误一般是因为我们在子表的引用字段中有一些值,而父表的引用/候选字段中不存在这些值。
有时,当我们将外键约束应用于现有表时,我们可能会遇到此错误,其中已经有数据。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当我们在子表中已经有工作/生产数据时,这不是一个选项。在大多数情况下,我们需要更新子表中的数据(而不是删除它们)。
现在,我们可以利用 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
语法应用外键约束。
您正在接受此约束检查,因为 Ordre
表没有在插入命令中提供引用 OrdreID
。
要在 Ordrelinje
中插入值,您首先必须在 Ordre
表中输入值并在 Orderlinje
表中使用相同的 OrdreID
。
或者您可以删除非空约束并在其中插入一个 NULL 值。
您必须删除子表中与父表主键没有任何对应外键值的数据。或者从子表中删除所有数据,然后在父表中插入与主键具有相同外键值的新数据.那应该工作。这里还有一个youtube video
在阅读了@Mr-Faizan 和其他答案后,这对我有所帮助。
取消勾选“启用外键检查”
在 phpMyAdmin 中并点击查询。我不了解 WorkBench,但其他答案可能会对您有所帮助。
https://i.stack.imgur.com/vaRFf.png
我有同样的问题。我正在现有表上创建关系,但具有不同的列值,这些值应该/假定是相关的。例如,我有一个表 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
重新插入数据。
在外键表中有一个不属于将相关的主键表中的值,因此您必须先删除所有数据/根据主键中的值调整外键表的值
这可以通过先在父表中插入相应的记录来解决,然后我们可以在子表的相应列中插入记录。还要检查列的数据类型和大小。它应该与父表列相同,即使引擎和排序规则也应该相同。尝试这个!这就是我解决我的问题的方法。如果我错了,请纠正我。
就我而言,这些表格完全一致。
无论如何,我遇到了这个错误,因为我(偶然)在同一个字段上创建了多个 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;
我发现在我尝试做我知道的正确代码之前,将外键从非空更改回空,让它工作。帮助我使用了 Mysql 工作台。我还必须设置 SET FOREIGN_KEY_CHECKS=0;
然后回到 =1;完成后。
即使我的父表具有我在子表中引用的所有值,我也遇到了这个问题。问题似乎是我无法将多个子引用添加到单个外键。换句话说,如果我有五行数据引用相同的外键,MySQL 只允许我上传第一行并给我错误 1452。
对我有用的是输入代码“SET GLOBAL FOREIGN_KEY_CHECKS=0”。之后,我关闭了 MySQL,然后重新启动它,我能够毫无错误地上传所有数据。然后我键入“SET GLOBAL FOREIGN_KEY_CHECKS=1”将系统恢复正常,尽管我不完全确定 FOREIGN_KEY_CHECKS 的作用。希望这可以帮助!
首先在父表上允许 NULL 并将默认值设置为 NULL。接下来创建外键关系。之后,您可以更新值以相应地匹配
您的 ORDRELINJE
表使用外键约束 constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
与 ORDER
表链接,根据该表 ORDRELINJE
的 Ordre int NOT NULL,
列必须匹配 ORDER
表的任何 Ordre int NOT NULL,
列。
现在这里发生的是,当您将新行插入 ORDRELINJE
表时,根据 fk 约束 Ordrelinje_fk
它正在检查 ORDER
表是否存在 OrdreID
并且它与任何不匹配OrderId,编译器正在抱怨外键违规。这就是您收到此错误的原因。
外键是您在任何表中用于链接两者的另一个表的主键。此键受您在创建表时指定的外键约束的约束。对数据的任何操作都不得违反此约束。违反此约束可能会导致此类错误。
希望我说清楚了。
在插入外键属性值时,首先验证属性类型,以及父关系中的主键属性值,如果父关系中的值匹配,那么您可以轻松插入/更新子属性值。
您应该在每个表中至少插入一个原始表(您希望外键指向的表),然后您可以插入或更新外键的值
您应该将 PRIMARY TABLE 中的 REFERENCES KEY 中的数据添加到 CHILD TABLE 中的 FOREIGN KEY 这意味着不要将随机数据添加到外键中,只需使用可访问的主键中的数据
description of data in foreign key
出现问题的原因是在子表中插入一些数据后,在子表中设置了外键。
尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,它将起作用。
检查号码。父表中与子表匹配的记录,并且主键必须与外键引用匹配。这对我有用。
我在这里遇到同样的问题是我的情况
我把 empty('') 值设为 NULL 现在这个 '' 值与父表的 id 不匹配
https://i.stack.imgur.com/9x9M3.png
https://i.stack.imgur.com/hDkPK.png
对于 PhpMyAdmin ,转到您创建外键的表的 结构,然后单击 Relation view ,在 on Delete 下选择 No Action和更新部分。注意:这对我有用。 enter image description here
生病挤在这里:我的案例是试图为一个确实存在的帖子创建一个赞;在提交到数据库时,引发了错误。解决方案是先创建帖子然后喜欢它。据我了解,如果要将 post_id 保存在 likes 表中,它必须首先检查 posts 表以确定存在。我发现这样更好,因为那样对我来说更合乎逻辑..
当您使用外键时,您的列顺序应该与插入相同。
例如,如果您在 table2 的 table1 中添加 (userid, password)
,那么从 table2 的顺序应该是相同的 (userid, password)
和 不像 (password,userid)
,其中 userid
是 table1 的 table2 中的 外键。
您的问题的答案是您必须在主键和辅助键中设置相同的值。谢谢
实际上,我解决了这个“插入到数据库名称.表名”的问题。当我尝试添加“插入数据库名称”之类的数据时,它就起作用了。
只是要寻找其他东西。如果您必须从其中一个表中删除记录并且期望值从 1 开始,您可能会收到此错误。解决方案是在所有父表上运行 SHOW * FROM 表名。当我这样做时,我注意到在我之前遇到问题的一张表中,我不得不删除一些主键值不是我期望它们来自以前的 SELECT * 的记录。
上面可能会更好地回答,但是在 mysql 工作台中工作时,您不需要立即提交事务,您可以同时提交父元素和子元素。因此,使用 sql 或在 gui 中设置父级,并在 gui / sql 中添加子级并同时提交。
如果在代码中工作并遇到此问题,您可以创建一个工厂来创建父级,然后创建子级/加入。
从理论上讲,您需要一个订单才能拥有一个 OrderId,从而创建一个订单。创建一个 OrderId 并且该 OrderId 可能有许多关联的产品,然后您可以将它们添加到 OrderId 或按照您的意愿进行操作。