PostgreSQL:列表依赖行

时间:2012-10-05 14:48:43

标签: sql postgresql foreign-keys cascade

如何使用PostgreSQL查看哪些条目依赖于给定条目? (依赖意思是“使用引用该条目的外键”)。

基本上,我想检查在DELETE表的给定条目时可以级联哪些条目。

3 个答案:

答案 0 :(得分:3)

要根据fk约束查看所有实际,请使用下述工具识别列。

使用ON DELETE CASCADE定义外键约束时,将删除依赖行(可能会将DELETE级联到更多取决于表)。

使用ON DELETE SET NULL / ON DELETE SET DEFAULT定义外键约束时,只会将列中的值重置为NULL /默认值。

否则,具有相关行的行上的DELETE将失败并出现异常。

然后在标识的表/列上运行如下查询:

SELECT f.tbl_fk_id, f.col_fk
FROM   tbl_fk f
JOIN   tbl t ON f.col_fk = t.col
AND    <same condition as DELETE here>;

pgAdmin提供此功能:

Dependents

在对象浏览器中选择左侧的对象,然后选择右上方的dependents窗格。

pgAdmin使用一些查询到系统目录来汇编列表。如果您想自己构建查询,可以记录发出的命令。

此外,在删除您不完全确定家属的对象时,请先尝试普通DROP(不使用CASCADE)。如果存在任何依赖,您将收到错误消息...

最后,谨慎行事!,您可以start a transaction发出命令:

BEGIN;
DROP TABLE tbl CASCADE;

然后,如果你喜欢你所看到的:

COMMIT;

如果你不这样做:

ROLLBACK;

它将永远不会发生。 ;)

你会看到这样的事情:

NOTICE:  drop cascades to 4 other objects
DETAIL:  drop cascades to constraint tbl1_tbl_id_fkey on table myschema.tbl1
drop cascades to constraint tbl_winner_tbl_id_fkey on table myschema.tbl_foo
drop cascades to constraint bar_tbl_id_fkey on table myschema.bar
drop cascades to constraint tbl1_tbl_id_fkey on table x.tbl1

Query returned successfully with no result in 47 ms.

答案 1 :(得分:2)

现有答案使用pg_catalog,这是可以的,但在主要版本的PostgreSQL之间可能会发生不兼容的变化。您应尽可能使用the information_schema代替。

SELECT *
FROM  information_schema.constraint_column_usage ccu
INNER JOIN information_schema.referential_constraints rc 
USING (constraint_catalog, constraint_schema, constraint_name);

请参阅:

答案 2 :(得分:1)

您可以直接从PostgreSQL系统目录中查询:

SELECT
  depending.relname as depending_table,
  referenced.relname as referenced_table
FROM pg_catalog.pg_depend d
JOIN pg_catalog.pg_constraint fkey ON fkey.oid=d.objid AND fkey.contype='f'
JOIN pg_catalog.pg_class depending ON depending.oid=fkey.conrelid
JOIN pg_catalog.pg_class referenced ON referenced.oid=d.refobjid
WHERE fkey.confdeltype='c'             -- just cascading deletes
  AND referenced.oid != depending.oid  -- ignoring reflexive dependencies
  AND referenced.relkind='r'           -- tables only

请参阅this SQL Fiddle及相关文档:

对此进行扩展,告诉您所涉及的列留给读者练习。 (提示:pg_attribute。)