我在mysql workbench中创建了如下表:
顺序表:
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
,约束 Ordrelinje_fk
外键( Ordre
)参考文献 Ordre
( OrdreID
))
我看过其他关于这个主题的帖子,但运气不好。我是在监督什么还是知道该怎么做?
22条答案
按热度按时间5jvtdoz216#
您应该在每个表中至少插入一个raw(您希望外键指向的表),然后可以插入或更新外键的值
w1e3prcc17#
使用外键时,插入时列的顺序应该相同。
例如,如果要添加
(userid, password)
从表1到表2,从表2到表1的顺序应该相同(userid, password)
而且不像(password,userid)
哪里userid
是表1的表2中的外键。sg3maiej18#
检查父表中与子表匹配且主键必须与外键引用匹配的记录数。这对我有用。
pb3skfrl19#
取自使用外键约束
外键关系涉及一个包含中心数据值的父表,以及一个具有指向其父表的相同值的子表。外键子句在子表中指定。
如果父表中没有匹配的候选键值,它将拒绝任何尝试在子表中创建外键值的插入或更新操作。
所以你的错误
Error Code: 1452. Cannot add or update a child row: a foreign key constraint fails
本质上意味着,您正在尝试向Ordrelinje
中不存在匹配行(orderid)的表Ordre
table。必须首先将行插入到
Ordre
table。9bfwbjaz20#
这可以通过先在父表中插入相应的记录,然后在子表的相应列中插入记录来解决。还要检查列的数据类型和大小。它应该与父表列相同,甚至引擎和排序规则也应该相同。试试这个!我就是这样解决我的问题的。如果我错了,请纠正我。
kdfy810k21#
发生此错误的原因通常是子表的引用字段中存在某些值,而父表的引用/候选字段中不存在这些值。
有时,当我们将外键约束应用于现有表时,可能会出现此错误,因为这些表中已经有数据。其他一些答案建议从子表中完全删除数据,然后应用约束。但是,当子表中已经有工作/生产数据时,这不是一个选项。在大多数情况下,我们需要更新子表中的数据(而不是删除它们)。
现在,我们可以利用
Left Join
查找子表中的所有行,该子表在父表中没有匹配的值。以下查询将有助于获取那些不匹配的行:现在,您通常可以执行以下一个(或多个)步骤来修复数据。
根据您的“业务逻辑”,您需要用父表中的现有值更新/匹配这些不匹配的值。有时您可能需要设置它们
null
也。删除这些具有不匹配值的行。
在父表中添加新行,对应于子表中不匹配的值。
一旦数据被修复,我们就可以使用
ALTER TABLE
语法。lymgl2op22#
出现此问题的原因是,在子表中插入一些数据后,在子表中设置了外键。
尝试从子表中删除所有数据,然后设置外键,然后在表中添加/插入数据,就可以了。