🔥码云GVP开源项目 12k star Uniapp+ElementUI 功能强大 支持多语言、二开方便! 广告
# 5.12\. 依赖性跟踪 如果你创建了一个包含许多表,并且带有外键约束、视图、触发器、函数等复杂的数据库结构。 那么你就会在对象之间隐含地创建了一个依赖性的网络。比如,一个带有外键约束的表依赖于它所引用的表。 为了保证整个数据库结构的完整性,PostgreSQL 保证你无法删除那些还被其它对象依赖的对象。比如,试图删除在[Section 5.3.5](#calibre_link-1803) 里被订单表所依赖的产品表是不能成功的,会有类似下面的错误信息出现: ``` 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`以获取缺省的行为(防止删除那些其它对象所依赖的对象)。 > **Note:** 根据 SQL 标准,要求至少声明`RESTRICT`或`CASCADE`中的一个。 实际上没有哪种数据库系统强制这一点,但是缺省的行为是`RESTRICT` 还是`CASCADE`则因系统而异。 > **Note:** 在PostgreSQL 7.3之前的外键约束依赖性和序列字段依赖性在升级过程中都_不会_得到维护或者创建。 所有其它的依赖性类型在从7.3版本以前的数据库升级过程中都将得到恰当的创建。