我有几个表使用外键引用一个主表。
我的目标是从主表中删除一条一揽子删除语句,然后删除所有将数据作为外键的语句。
但是,由于引用在从其他表中删除之前被删除,因此我得到了约束错误。有什么方法可以告诉 SQL 我想从所有将数据用作外键的表中删除?
我有几个表使用外键引用一个主表。
我的目标是从主表中删除一条一揽子删除语句,然后删除所有将数据作为外键的语句。
但是,由于引用在从其他表中删除之前被删除,因此我得到了约束错误。有什么方法可以告诉 SQL 我想从所有将数据用作外键的表中删除?
要将父表上的删除级联到引用表,请使用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 CASCADE
then 来获得稍微不错的性能,那么在外键列上创建索引至关重要。即使这样,对于目标表的批量删除,首先从每个外键引用表中删除通常要快得多,而不是依赖于级联。
如果您ON UPDATE CASCADE
正在使用ON DELETE CASCADE
.
如果要从主表中删除所有行,而不仅仅是其中的一部分,则最好使用以下命令截断表TRUNCATE ... CASCADE
:
CASCADE
自动截断所有具有对任何命名表或由于 CASCADE 添加到组中的表的外键引用的表。
DELETE
将外键链接到正在运行语句的表的表级联的唯一方法是ON DELETE CASCADE
在键上设置选项,您需要运行ALTER TABLE
语句将它们从当前值更改为此选项:
http://www.postgresql.org/docs/current/interactive/ddl-constraints.html