5.13. 依赖跟踪

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

为了保证整个数据库结构的完整性,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消息)。

All drop commands in **PostgreSQL**中的所有删除命令都支持CASCADE。当然,其本质的区别随着对象的类型而不同。我们也可以用RESTRICT代替CASCADE来获得默认行为,它将阻止删除被其他对象依赖的对象。

注意: 根据SQL标准,指定RESTRICT或CASCADE是被要求的。但没有哪个数据库系统真正强制了这个规则,但是不同的系统中两种默认行为都是可能的。 注意: 早于版本7.3之前的PostgreSQL中的外键约束依赖和序数列依赖在升级过程中会被维护或创建。其他类型的依赖会在一个早于7.3的数据库的升级过程中自动被创建。

下一节:当一个表被创建后,它不包含数据。在数据库可以有点用之前要做的第一件事就是向里面插入数据。数据在概念上是以每次一行地方式被插入的。你当然可以每次插入多行,但是却没有办法一次插入少于一行的数据。即使你只知道几个列的值,那么你也必须创建一个完整的行。