1

我有几个表使用外键引用一个主表。

我的目标是从主表中删除一条一揽子删除语句,然后删除所有将数据作为外键的语句。

但是,由于引用在从其他表中删除之前被删除,因此我得到了约束错误。有什么方法可以告诉 SQL 我想从所有将数据用作外键的表中删除?

4

2 回答 2

2

要将父表上的删除级联到引用表,请使用ON DELETE CASCADE外键。但是,如果您要从主表中删除所有TRUNCATE行,则可以使用更好的方法来解决您的问题;看到这篇文章的结尾。

您可以ALTER TABLE将默认ON DELETE NO ACTION外键更改为ON DELETE CASCADE. ON DELETE CASCADE删除约束,然后使用修改器重新创建它。CREATE TABLE有关外键约束语法的信息, 请参阅约束文档

简而言之,而不是col coltype REFERENCES fktable(fkcol)您使用col coltype REFERENCES fktable(fkcol) ON DELETE CASCADE.

如果您使用ON DELETE CASCADEthen 来获得稍微不错的性能,那么在外键列上创建索引至关重要。即使这样,对于目标表的批量删除,首先从每个外键引用表中删除通常要快得多,而不是依赖于级联。

如果您ON UPDATE CASCADE正在使用ON DELETE CASCADE.


如果要从主表中删除所有行,而不仅仅是其中的一部分,则最好使用以下命令截断表TRUNCATE ... CASCADE

CASCADE

自动截断所有具有对任何命名表或由于 CASCADE 添加到组中的表的外键引用的表。

于 2012-10-29T01:06:34.657 回答
1

DELETE将外键链接到正在运行语句的表的表级联的唯一方法是ON DELETE CASCADE在键上设置选项,您需要运行ALTER TABLE语句将它们从当前值更改为此选项:

http://www.postgresql.org/docs/current/interactive/ddl-constraints.html

于 2012-10-29T01:06:47.683 回答