5.12. 依赖跟踪

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

为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。例如,尝试删除Section 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来获得默认行为,它将阻止删除被其他对象依赖的对象。

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

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