在 MySQL 中,我有 2 个表,该表ciudadano
与另一个表相关examen
;考试有examen.Cedula_Ciudadano
来自的领域ciudadano.Cedula
。
如何更新公民的记录并同时在考试中更新?为什么它向我发送错误:
error 1452. Cannot add or update a child row: a foreign key constraint fails
代码如下:
UPDATE
examen e
JOIN ciudadano c
on e.Cedula_Ciudadano=c.Cedula
SET
e.Cedula_Ciudadano='s',
c.Cedula='s'
WHERE
c.Cedula='222-301000-11023'
一般来说,使用不随时间固定的字段作为主键并不是一个好主意。例如,在 table 中
Ciudadano
,最好通过以下方式创建一个自增字段:id_ciudadano INT NOT NULL AUTO_INCREMENT
,并将 ID 添加为一个值。这样,id_ciudadano
永远不会改变,并且可能是一个完美的主键,而不必实现这个或其他答案中描述的任何技巧。可能的解决方案
在以下情况下会出现错误
Cannot add or update a child row: a foreign key constraint fails
:根据您的说法,我假设您正在尝试更改公民的身份证。很可能,该公民已经在相应的表中注册了考试,因此它会引发错误。
你可以做两件事:
CONSTRAINT
您的外键。删除引用的依赖项
假设我们有一个有 ID 的公民
1234
,并且说用户在表中有两个考试examen
。您所要做的就是运行以下命令:如果您想要保留该公民的考试,请保存考试数据并稍后使用新 ID 插入它们。如果您是从脚本中执行此操作,那将是一项简单的任务。如果您从计划的服务中执行此操作,大多数语言都提供了使插入任务变得相当容易的功能。
将规范添加到约束
创建外键时,默认情况下在 MySQL 中添加以下规范:
您所要做的就是更改这些设置,这样当您更改公民 ID 时,考试中的参考资料也会随之更改。缺点:只能在建表的时候做,例如:
当表已经创建并且已经有数据时,它必须被删除并重新创建(有关更多信息,请参阅此答案)
我有同样的错误,并能够修复它...
你也可以使用...
但第一个选项更安全,因为它仅在会话期间处于活动状态
来源:错误 1452:无法添加或更新子行:外键约束失败