5.10. 依赖性追踪

如果你创建了一个包含许多表,并且带有外键约束,视图, 触发器,函数等等的复杂数据库结构。那么你就会在对象 之间隐含地创建了一个依赖性的网络。比如,一个带有外键 约束的表依赖于它引用的表。

为了保证整个数据库结构的完整性,PostgreSQL 保证 你无法删除那些还有其它对象依赖的对象。比如,试图删除我们在 Section 5.4.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
        Use DROP ... CASCADE to drop the dependent objects too

这个错误信息包含一个有用的提示:如果你不想惹来分别删除所有 依赖对象的麻烦,你可以运行

DROP TABLE products CASCADE;

然后所有被依赖的对象都将被删除。在这种情况下, 它并不删除订单表,它只删除外键约束。(如果你想检查 DROP ... CASCADE 会干什么,运行不带 CASCADEDROP然后阅读 NOTICE 信息。)

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

注意: 根据 SQL 标准,要求至少声明 RESTRICT 或者 CASCADE 中的一个。 实际上没有哪种数据库系统是这么实现的,但是缺省的行为是 RESTRICT 还是 CASCADE 则因系统而异。

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