use*_*677 95 mysql sql mariadb mysql-error-1452
我在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;
Run Code Online (Sandbox Code Playgroud)
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;
Run Code Online (Sandbox Code Playgroud)
和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;
Run Code Online (Sandbox Code Playgroud)
所以当我尝试在ORDRELINJE
表中插入值时,我得到:
错误代码:1452.无法添加或更新子行:外键约束失败(
srdjank
.Ordrelinje
,CONSTRAINTOrdrelinje_fk
FOREIGN KEY(Ordre
)REFERENCESOrdre
(OrdreID
))
我已经看过关于这个主题的其他帖子,但没有运气.我在监督某事或知道该怎么做?
Rah*_*hul 134
外键关系涉及保存中心数据值的父表,以及具有指向其父级的相同值的子表.FOREIGN KEY子句在子表中指定.
如果父表中没有匹配的候选键值,它将拒绝任何尝试在子表中创建外键值的INSERT或UPDATE操作.
因此,您的错误Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
实际上意味着,您正在尝试向Ordrelinje
表中添加一行,而表中没有匹配的行(OrderID)Ordre
.
您必须先将行插入Ordre
表中.
小智 29
您正在进行此约束检查,因为ordre表没有在insert命令中提供的引用顺序ID.
要在ordrelinje中插入值,首先必须在ordre表中输入值,并在orderlinje表中使用相同的ordreID.
或者,您可以删除非null约束并在其中插入NULL值.
Hum*_*rey 21
您必须将子表中没有任何对应外键值的数据删除到父表主键.或者从子表中删除所有数据,然后在父表中插入与主键具有相同外键值的新数据.这应该工作
Mad*_*iya 11
通常会发生此错误,因为我们在子表的引用字段中有一些值,而在父表的引用/候选字段中不存在这些值。
有时,当我们将外键约束应用于现有表且已经有数据时,可能会遇到此错误。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选择。在大多数情况下,我们将需要更新子表中的数据(而不是删除它们)。
现在,我们可以利用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
Run Code Online (Sandbox Code Playgroud)
现在,您通常可以执行以下一个(或多个)步骤来修复数据。
null
。数据固定后,我们可以使用ALTER TABLE
语法应用外键约束。
小智 8
问题出在外键约束上。默认情况下(SET FOREIGN_KEY_CHECKS = 1)。FOREIGN_KEY_CHECKS选项指定是否检查InnoDB表的外键约束。MySQL-SET FOREIGN_KEY_CHECKS
我们可以在运行Query之前将外键检查设置为禁用。禁用外键。
在运行查询之前执行以下任一行,即可成功运行查询。:)
1)对于会话(推荐)
SET FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
2)全球
SET GLOBAL FOREIGN_KEY_CHECKS=0;
Run Code Online (Sandbox Code Playgroud)
我发现在我尝试执行我所知道的正确代码之前,将外键从非空更改回空,使其正常工作。帮助我使用 Mysql 工作台。我还必须设置SET FOREIGN_KEY_CHECKS=0;
然后返回=1; 完成后。
小智 5
我有同样的问题。我正在现有表上创建关系,但具有不同的列值,这些值应该/假设是相关的。例如,我有一个表USERS
,其中有一列USERID
包含行1,2,3,4,5
。然后我有另一个带有行ORDERS
的列的子表。然后我运行 MySQl 命令USERID
1,2,3,4,5,6,7
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 表中导出数据,然后从中删除所有数据,再次重新运行该命令,这次成功了,然后使用USERID
USERS 表中的相应s重新插入数据。
归档时间: |
|
查看次数: |
406168 次 |
最近记录: |