9.3 9.4 9.5 9.6 10 11 12
阿里云PostgreSQL 问题报告 纠错本页面

5.13. 依赖跟踪

当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。

为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。例如,尝试删除第 5.3.5 节中的产品表会导致一个如下的错误消息,因为有订单表依赖于产品表:

DROP TABLE products;

NOTICE:  constraint orders_product_no_fkey on table orders depends on table products
ERROR:  cannot drop table products because other objects depend on it
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

该错误消息包含了一个有用的提示:如果我们不想一个一个去删除所有的依赖对象,我们可以执行:

DROP TABLE products CASCADE;

这样所有的依赖对象将被移除。在这种情况下,订单表不会被移除,但是它的外键约束会被移除(如果希望检查DROP ... CASCADE会干什么,运行不带CASCADEDROP并阅读NOTICE消息)。

All drop commands in PostgreSQL中的所有删除命令都支持CASCADE。当然,其本质的区别随着对象的类型而不同。我们也可以用RESTRICT代替CASCADE来获得默认行为,它将阻止删除被其他对象依赖的对象。

注意: 根据SQL标准,指定RESTRICTCASCADE是被要求的。但没有哪个数据库系统真正强制了这个规则,但是不同的系统中两种默认行为都是可能的。

注意: 早于版本7.3之前的PostgreSQL中的外键约束依赖和序数列依赖在升级过程中会被维护或创建。其他类型的依赖会在一个早于7.3的数据库的升级过程中自动被创建。

<
/BODY >