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信息。

PostgreSQL里的所有删除命令都支持声明CASCADE。 当然,具体的依赖性实体取决于对象的类型。你也可以写RESTRICT 而不是CASCADE以获取缺省的行为(防止删除那些其它对象所依赖的对象)。

Note: 根据 SQL 标准,要求至少声明RESTRICTCASCADE中的一个。 实际上没有哪种数据库系统强制这一点,但是缺省的行为是RESTRICT 还是CASCADE则因系统而异。

Note: 在PostgreSQL 7.3之前的外键约束依赖性和序列字段依赖性在升级过程中都不会得到维护或者创建。 所有其它的依赖性类型在从7.3版本以前的数据库升级过程中都将得到恰当的创建。