我在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条答案
按热度按时间drkbr07n1#
在我的情况下,表格是完全一致的。
不管怎样,我得到这个错误是因为我(偶然)在同一个字段上创建了多个fk约束。
我运行以下查询以显示所有键:
我用以下查询删除了错误的:
您也可以在运行此查询时检查它:
zu0ti5jz2#
我把这个挤在这里:我的案子是想为一个力不从心的职位创造一个类似的职位;提交到数据库时出现错误。解决方法是先创建帖子,然后喜欢它。根据我的理解,如果post\u id要保存在likes表中,它必须首先检查posts表以确定是否存在。我觉得这样比较好,因为那样对我来说更合乎逻辑。。
axzmvihb3#
首先允许父表为null,并将默认值设置为null。接下来创建外键关系。之后,您可以相应地更新值以进行匹配
0wi1tuuw4#
在外键表中有一个不属于将要关联的主键表的值,因此必须首先删除所有数据/根据主键中的值调整外键表的值
eulz3vhy5#
在阅读了“法赞先生”和其他答案后,这帮了我的忙。
取消选中“启用外键检查”
并点击查询。我不知道workbench的情况,但是其他的答案可能会对你有所帮助。
l5tcr1uw6#
您应该将数据从主表中的引用键添加到子表中的外键
这意味着不要向外键添加随机数据، 只需使用主键中可访问的数据
外键数据说明
hfwmuf9z7#
问题是外键约束。默认情况下(将“外键检查”设置为1)。foreign\u key\u checks选项指定是否检查innodb表的外键约束。mysql-设置外部密钥检查
我们可以在运行查询之前将外键检查设置为禁用。禁用外键。
在运行查询之前执行其中一行,就可以成功运行查询。:)
1) 会话(推荐)
2) 全球
slwdgvem8#
你的
ORDRELINJE
表链接到ORDER
使用外键约束的表constraint Ordrelinje_fk foreign key(Ordre) references Ordre(OrdreID)
根据哪个Ordre int NOT NULL,
表的列ORDRELINJE
必须匹配任何Ordre int NOT NULL,
列ORDER
table。现在发生的事情是,当你把新行插入
ORDRELINJE
表,根据fk约束Ordrelinje_fk
它正在检查ORDER
如果OrdreID
是否存在,并且由于它与任何orderid都不匹配,编译器正在抱怨外键冲突。这就是你得到这个错误的原因。外键是另一个表的主键,您可以在任何表中使用它来链接这两个表。此键由创建表时指定的外键约束绑定。对数据的任何操作都不能违反此约束。违反此约束可能会导致这样的错误。
希望我说清楚。
jk9hmnmh9#
必须删除子表中与父表主键没有任何对应外键值的数据。或者删除子表中的所有数据,然后插入与父表中主键具有相同外键值的新数据。这应该管用。这里还有一段youtube视频
kwvwclae10#
即使父表中有我在子表中引用的所有值,我也会遇到这个问题。问题似乎是我不能向一个外键添加多个子引用。换句话说,如果有五行数据引用同一个外键,mysql只允许我上传第一行,并给出错误1452。
对我有效的是输入代码“set global foreign\u key\u checks=0”。之后,我关闭了mysql,然后重新启动它,我能够上传我的所有数据没有错误。然后我键入“set global foreign\u key\u checks=1”将系统设置回正常状态,尽管我不完全确定foreign\u key\u checks的作用。希望这有帮助!
fsi0uk1n11#
我知道这个线程已经很长了,但是当我为分类表运行一个laravel seeding时,它创建了一些奇怪的id,它们是1,11,21,31,这导致了我的错误,因为我试图在另一个表中引用它,使用id,比如1,2,3。。。一整天,直到我手动检查数据库,
因此,有时要查找数据库表以确保外来数据确实正确存在。
干杯
ycl3bljg12#
我也有同样的问题。我在现有的表上创建关系,但是有不同的列值,这些列值被认为是相关的。例如,我有一张table
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表中导出数据,然后删除其中的所有数据,再次运行命令,这次成功了,然后用相应的USERID
用户表中的。csga3l5813#
你得到这个约束检查是因为
Ordre
表没有引用OrdreID
在insert命令中提供。插入值
Ordrelinje
,首先必须在中输入值Ordre
表和使用相同OrdreID
在Orderlinje
table。或者可以删除notnull约束并在其中插入null值。
j2cgzkjk14#
您的问题的答案是您必须在主键和副键中设置相同的值。谢谢
1cosmwyk15#
插入外键属性值时,首先验证属性类型,以及父关系中的主键属性值,如果父关系中的值匹配,则可以轻松插入/更新子属性值。