外键的第一次体验,我做错了什么?

时间:2012-01-10 16:00:29

标签: mysql phpmyadmin

我一直暗示要为外键提供支持,因为我正试图在数据库编程方面做得更好。问题是,如果删除了作业表中的作业,它会在消息表中留下与其相关的孤立消息。所以外键被介绍给我作为解决方案。

然而,当我尝试这样做时,我已经得到了这个,而且我不确定它在说什么,而且,我甚至不确定我应该在哪个方面设置限制,从作业到消息, 或相反亦然。 :(

这是错误:

 #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相匹配。

感谢您提供的任何帮助。

3 个答案:

答案 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”中的行 - 否则约束会引发错误。