没有外键约束,需要做一个复杂的删除

时间:2011-05-22 04:17:46

标签: mysql database database-design foreign-keys

我有一个网站,我一直在努力创建非常迅速,现在我正在偿还一些技术债务。我有一个复杂的问题:

我的网站处理安排加息。一旦你创建了一个徒步旅行,它就有很多与之相关的东西: 留言板,与会者列表,所属群组,拼车,路线,小道等。

这是一个例子,你可以看到我在说什么: http://www.comehike.com/hikes/scheduled_hike.php?hike_id=172

我所说的技术债务是我从未在数据库中创建外键,现在需要进行级联删除,我不知道如何去做,以便我不会引入一百万个错误:)

我现在应该为所有表制作外键吗?我该怎么做?

谢谢, 亚历

4 个答案:

答案 0 :(得分:2)

查看FOREIGN KEY Constraints上的MySQL文档。请注意,您需要使用innoDB表。

ALTER TABLE <tablename>
ADD CONSTRAINT <fkname> FOREIGN KEY <index name>(<columns>)
REFERENCES <othertable> (<columns>)
ON DELETE CASCADE

答案 1 :(得分:2)

我建议为数据库中的表创建外键。这将是处理您所面临问题的更有力的方法。您显然了解外键对数据库的影响,以及如何处理密钥。

如果我遇到这个问题,我会使用数据库的图形界面,如果我有一个(例如PhpMyAdmin),否则快速谷歌会带来一些tutorials


编辑:在链接教程中,在多对一关系中,您可以在“多个”表上调整键,指示该表中的某个列只能包含某个列中的某个列。 “一”表。嗨,链接为一个有效的例子。

将键添加到已有数据的表时,如果某些数据格式不正确,则可能无法添加外键。例如,如果您有一个电话号码表引用一个人员表(许多电话号码为一个人),并且您有任何具有无效person_id的电话号码(可能是人5被删除,并且仍有一个电话号码,其person_id为5 )在删除有问题的电话号码之前,您将无法创建外键。

答案 2 :(得分:1)

如果您还没有制作正式的外键,那么您是否以其他方式创建了允许链接表格或所有表格无关的密钥?

如果无论如何要关联表格,那么你只需编写一个级联删除代码。

否则可能会重新设计或添加外键的乐趣。 =))

如果您还没有获得MySQL Workbench的副本并从那里添加外键重新设计它。这也将为您生成SQL代码。

答案 3 :(得分:0)

我也会创建外键,但如果有任何理由阻止你这样做,还有另一个解决方案是创建触发器。当数据库中的表发生更新,删除或插入时,您可以告诉触发器基本上执行任何操作,包括更改其他表中的其他元组。以下是有关如何创建触发器的几个教程:

http://www.stanford.edu/dept/itss/docs/oracle/10g/server.101/b10759/statements_7004.htm http://msdn.microsoft.com/en-us/library/ms189799.aspx

第一个似乎更直接,更清晰,但如果它们都没有帮助只搜索谷歌搜索数据库触发器,那么你已经完成了设置!

我希望这会有所帮助:)