如何获取表的所有约束及外键关联的列与表信息
解决Oracle同时获取全约束+外键关联信息的问题
我明白你的需求:现有查询能列出指定表的所有约束,但拿不到外键对应的关联表和列;另一个查询能查外键但信息不全。下面给你一个整合后的SQL,一次性搞定所有信息:
SELECT a.OWNER AS CONSTRAINT_OWNER, a.TABLE_NAME AS TABLE_NAME, a.CONSTRAINT_NAME, a.CONSTRAINT_TYPE, c.COLUMN_NAME AS CONSTRAINT_COLUMN, -- 外键关联的父表信息 parent_a.TABLE_NAME AS REFERENCED_TABLE_NAME, parent_c.COLUMN_NAME AS REFERENCED_COLUMN_NAME, a.SEARCH_CONDITION FROM ALL_CONSTRAINTS a JOIN ALL_CONS_COLUMNS c ON a.CONSTRAINT_NAME = c.CONSTRAINT_NAME AND a.OWNER = c.OWNER -- 自连接父约束(针对外键约束) LEFT JOIN ALL_CONSTRAINTS parent_a ON a.R_CONSTRAINT_NAME = parent_a.CONSTRAINT_NAME AND a.OWNER = parent_a.OWNER LEFT JOIN ALL_CONS_COLUMNS parent_c ON parent_a.CONSTRAINT_NAME = parent_c.CONSTRAINT_NAME AND parent_a.OWNER = parent_c.OWNER -- 保证复合外键的列顺序对应正确 AND c.POSITION = parent_c.POSITION WHERE a.OWNER = 'YOUR_OWNER' -- 替换成你的目标用户 AND a.TABLE_NAME = 'YOUR_TABLE' -- 替换成你的目标表名 ORDER BY a.CONSTRAINT_TYPE, a.CONSTRAINT_NAME, c.POSITION;
关键逻辑说明:
- 自连接父约束:外键约束(
CONSTRAINT_TYPE='R')的R_CONSTRAINT_NAME字段指向父表的主键/唯一约束,通过这个字段关联就能拿到关联表名。 - 匹配列顺序:用
POSITION字段关联子表和父表的约束列,确保复合外键的多列对应关系准确。 - LEFT JOIN保留全量约束:非外键约束(比如主键、唯一键、检查约束)会被正常返回,只是
REFERENCED_*字段会显示为NULL,不会丢失任何约束信息。
约束类型速查:
P:主键约束U:唯一约束R:外键约束C:检查约束V:视图约束O:只读约束
这样你就能一次性获取指定表的所有约束细节,包括外键对应的关联表和列信息啦!
内容的提问来源于stack exchange,提问作者a p
相关产品推荐
相关产品推荐

