PostgreSQL 9.5.3 中文手册 | |||
---|---|---|---|
上一页 | 上一级 | 章 5. 数据定义 | 下一页 |
当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。
为了保证整个数据库结构的完整性,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的数据库的升级过程中自动被创建。