You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何获取表的所有约束及外键关联的列与表信息

解决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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 08:06:25