# 5.14.依赖项跟踪

当您创建复杂的数据库结构时,涉及许多带有外键约束、视图、触发器、函数等的表。您隐式地创建了对象之间的依赖关系网。例如,具有外键约束的表取决于它引用的表。

为了确保整个数据库结构的完整性,PostgreSQL确保不能删除其他对象仍然依赖的对象。例如,试图删除我们在中考虑的products表第5.4.5节,而orders表取决于它,将导致如下错误消息:

DROP TABLE products;

ERROR:  cannot drop table products because other objects depend on it
DETAIL:  constraint orders_product_no_fkey on table orders depends on table products
HINT:  Use DROP ... CASCADE to drop the dependent objects too.

错误消息包含一个有用的提示:如果不想单独删除所有依赖对象,可以运行:

DROP TABLE products CASCADE;

所有依赖对象都将被删除,依赖于它们的对象也将被递归删除。在这种情况下,它不会删除orders表,只会删除外键约束。它停在那里,因为没有任何东西依赖于外键约束。(如果你想检查什么滴大量行,快跑没有大量并阅读细节输出。)

几乎全部PostgreSQL中的命令支持指定大量.当然,可能的依赖关系的性质因对象的类型而异。你也可以写作限制而不是大量获取默认行为,即防止删除任何其他对象所依赖的对象。

# 笔记

根据SQL标准,指定限制大量在一个命令没有数据库系统实际执行该规则,但默认行为是否限制大量不同的系统各不相同。

如果命令列出多个对象,大量仅当指定组之外存在依赖项时才需要。比如说放下桌子tab1,tab2外键引用的存在表1从…起表2不是这个意思大量这是成功所必需的。

对于用户定义的函数,PostgreSQL跟踪与函数的外部可见属性(如其参数和结果类型)关联的依赖项,但只有通过检查函数体才能知道的依赖项。作为一个例子,考虑这种情况:

CREATE TYPE rainbow AS ENUM ('red', 'orange', 'yellow',
                             'green', 'blue', 'purple');

CREATE TABLE my_colors (color rainbow, note text);

CREATE FUNCTION get_color_note (rainbow) RETURNS text AS
  'SELECT note FROM my_colors WHERE color = $1'
  LANGUAGE SQL;

(见第38.5节有关SQL语言函数的说明。)PostgreSQL将知道获取颜色注释功能取决于类型:删除类型将强制删除函数,因为不再定义其参数类型。但PostgreSQL不会考虑获取颜色注释依靠我的颜色表,因此在表被删除时不会删除该函数。虽然这种方法有缺点,但也有好处。如果表丢失,函数在某种意义上仍然有效,尽管执行它会导致错误;创建一个同名的新表将允许该函数再次工作。