PostgreSQL 9.3.4 文档 | ||||
---|---|---|---|---|
Prev | Up | Chapter 5. 数据定义 | Next |
当我们创建一个涉及到很多具有外键约束、视图、触发器、函数等的表的复杂数据库结构时,我们隐式地创建了一张对象之间的依赖关系网。例如,具有一个外键约束的表依赖于它所引用的表。
为了保证整个数据库结构的完整性,PostgreSQL确保我们无法删除仍然被其他对象依赖的对象。例如,尝试删除Section 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来获得默认行为,它将阻止删除被其他对象依赖的对象。
Note: 根据SQL标准,指定RESTRICT或CASCADE是被要求的。但没有哪个数据库系统真正强制了这个规则,但是不同的系统中两种默认行为都是可能的。
Note: 早于版本7.3之前的PostgreSQL中的外键约束依赖和序数列依赖在升级过程中不会被维护或创建。其他类型的依赖会在一个早于7.3的数据库的升级过程中自动被创建。