外键 - 暂时绕过?

时间:2010-04-30 19:05:14

标签: mysql database-design foreign-keys

我刚刚开始了解外键在数据库设计中的优点(mySQL / innoDB),我想知道在执行特定的删除查询时是否有任何方法可以暂时绕过外键,只需在父表中删除,而不是来自链接的子表。

由于

5 个答案:

答案 0 :(得分:6)

甚至不考虑这样做,它会导致数据库的数据完整性问题。这是一个非常糟糕的主意。外键的全部目的是让人们不要做这样的事情!

答案 1 :(得分:2)

您可以在外键上使用ON DELETE SET NULL子句。这将允许您删除父表中的行。子表中引用父表中已删除行的行将外键列设置为NULL。

就我个人而言,我从未真正需要这种功能。

http://dev.mysql.com/doc/refman/5.1/en/innodb-foreign-key-constraints.html

答案 2 :(得分:1)

FOREIGN KEY应该始终保持数据库的一致性。所以它反对将外键放在数据库中的想法,并且仍然允许删除引用的行......

虽然......有一种情况,暂时违反这些限制可能有意义:在交易期间。重要的是在事务之前和之后使数据库保持一致,不要让任何其他数据库用户看到不一致的数据,但在事务期间和仅在执行事务的会话中,临时不一致不会受到影响。 SQL允许这样做:您可以定义一些外键(有时是其他约束)可延迟,并请求推迟将它们强制执行到事务结束。

通过这种方式,您可以对数据库执行一组复杂的更改,甚至删除某些行仍然在其他表中引用,并且仍然具有数据库一致性和事务结束。其他数据库用户甚至看不到暂时的不一致。

更新:似乎MySQL不支持延迟约束。所以这个答案可能不是很有用。

答案 3 :(得分:0)

您始终可以发出命令来禁用特定键。除此之外,我无法绕过约束。我猜你正在做一些批量加载操作,并且出于性能原因需要禁用密钥?

答案 4 :(得分:0)

编辑:DISABLE KEYS不绕过外键检查,只绕过唯一密钥检查。

要删除外键约束,请使用:

ALTER TABLE <tablename> DROP FOREIGN KEY <constraintname>;

然后要恢复约束,您需要在另一个ALTER TABLE语句中重新声明外键约束。

有关详细信息,请参阅http://dev.mysql.com/doc/refman/5.1/en/alter-table.html

但我同意@HLGEM并给出他的答案+1。如果你真的需要这样做,请仔细考虑。如果保留外键约束,大多数任务实际上更容易

您可以声明具有级联效果的外键,将子表值设置为NULL或DEFAULT值,以便删除父行。