如何使用PostgreSQL查看哪些条目依赖于给定条目? (依赖意思是“使用引用该条目的外键”)。
基本上,我想检查在DELETE
表的给定条目时可以级联哪些条目。
答案 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窗格。
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。)