如果你创建了一个包含许多表,并且带有外键约束、视图、触发器、函数等复杂的数据库结构。那么你就会在对象之间隐含地创建了一个依赖性的网络。比如,一个带有外键约束的表依赖于它所引用的表。
为了保证整个数据库结构的完整性,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 会干什么,运行不带 CASCADE 的 DROP 然后阅读 NOTICE 信息。
PostgreSQL 里的所有删除命令都支持声明 CASCADE 。当然,具体的依赖性实体取决于对象的类型。你也可以写 RESTRICT 而不是 CASCADE 以获取缺省的行为(仅限于删除那些其它对象所依赖的对象)。
【注意】根据 SQL 标准,要求至少声明 RESTRICT 或 CASCADE 中的一个。实际上没有哪种数据库系统强制这一点,但是缺省的行为是 RESTRICT 还是 CASCADE 则因系统而异。
【注意】在 PostgreSQL 7.3之前的外键约束依赖性和序列字段依赖性在升级过程中都不会得到维护或者创建。所有其它的依赖性类型 在从7.3版本以前的数据库升级过程中都将得到恰当的创建。