我一直暗示要为外键提供支持,因为我正试图在数据库编程方面做得更好。问题是,如果删除了作业表中的作业,它会在消息表中留下与其相关的孤立消息。所以外键被介绍给我作为解决方案。
然而,当我尝试这样做时,我已经得到了这个,而且我不确定它在说什么,而且,我甚至不确定我应该在哪个方面设置限制,从作业到消息, 或相反亦然。 :(
这是错误:
#1452 - Cannot add or update a child row: a foreign key constraint fails (`nzua9c8_tasks`.<result 2 when explaining filename '#sql-2929_701930'>, CONSTRAINT `#sql-2929_701930_ibfk_1` FOREIGN KEY (`id`) REFERENCES `jobs` (`id`) ON UPDATE NO ACTION)
另外,PHPMyAdmin的界面建议当我删除任务时,消息ID将被“限制”。我没有删除选项。我希望任何带有“job_id”的消息都与jobs表中的id相匹配。
感谢您提供的任何帮助。
答案 0 :(得分:2)
您希望将on delete cascade
添加到外键定义中(在脚本中on update no action
之后)。
所以它会是这样的:
alter table messages add foreign key (id) references jobs (id) on delete cascade
可以找到更多here。
答案 1 :(得分:0)
如果一个作业包含多个消息(1:N关系),则消息表应具有作业表的外键。
您的错误消息基本上表示当外部约束引用某些内容时,您无法更新/删除行。
因此,如果表作业有记录:
id name
1 job1
2 job2
消息表有记录
id name job_id
1 mes1 1
2 mes2 2
然后你不能从第一张表中删除记录。您应该首先更新消息表中的引用记录。
此外,您可以更改外键策略,以便自动销毁/更新相关记录。
答案 2 :(得分:0)
具有相应“约束”的外键用于确保“参照完整性”,并将解决您提到的“悬空参考”问题。
外键的“缺点”是必须以正确的顺序将数据填充到数据库中:
如果表“A”中的行包含指向表“B”中一行或多行的外键指针,那么必须先创建表“B”中的行,然后才能创建表“A”中的行 - 否则约束会引发错误。