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

如何在Oracle 18c中查看外键?以及查询ORA-02291错误对应的FK31_1的SQL方法

在Oracle 18c中查看外键及定位约束问题的方法

1. 如何查看Oracle 18c中的外键(FK)?

你可以通过Oracle自带的数据字典视图来查询外键信息,最常用的是针对当前用户对象的USER_CONSTRAINTS和USER_CONS_COLUMNS;如果要查看其他用户的外键,换成ALL_CONSTRAINTS/ALL_CONS_COLUMNS即可,管理员权限下还能用DBA_CONSTRAINTS/DBA_CONS_COLUMNS查看全库的约束。

查询当前用户所有外键的完整信息

SELECT 
    c.constraint_name AS fk_name,
    c.table_name AS child_table,
    cc.column_name AS fk_column,
    c.r_owner AS parent_owner,
    c.r_constraint_name AS parent_constraint,
    (SELECT table_name FROM user_constraints WHERE constraint_name = c.r_constraint_name) AS parent_table
FROM 
    user_constraints c
JOIN 
    user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE 
    c.constraint_type = 'R' -- R代表外键(Referential Constraint)
ORDER BY 
    c.table_name, cc.position;

这个查询会返回:

  • 外键约束名
  • 外键所在的子表
  • 外键对应的列
  • 父表的所有者
  • 父表的关联约束名(一般是主键或唯一键)
  • 父表名称

查看特定表的外键

如果只想聚焦某张表的外键,在WHERE条件里加上表名(注意Oracle默认大写存储对象名):

SELECT 
    c.constraint_name AS fk_name,
    cc.column_name AS fk_column,
    (SELECT table_name FROM user_constraints WHERE constraint_name = c.r_constraint_name) AS parent_table
FROM 
    user_constraints c
JOIN 
    user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE 
    c.constraint_type = 'R'
    AND c.table_name = 'EMPLOYEES'; -- 替换成你的目标表名

2. 如何查询错误ORA-02291中提到的FK31_1约束信息?

先给你解释下这个错误:ORA-02291是说违反了完整性约束,找不到对应的父键——说白了就是你插入/更新的数据里,外键列的值在父表的关联列中不存在。要获取FK31_1的详细信息,直接针对这个约束名查询数据字典就行:

查询FK31_1的完整关联信息

SELECT 
    c.constraint_name,
    c.table_name AS child_table,
    cc.column_name AS child_fk_column,
    c.r_owner AS parent_owner,
    c.r_constraint_name AS parent_constraint_name,
    (SELECT table_name FROM user_constraints WHERE constraint_name = c.r_constraint_name AND owner = c.r_owner) AS parent_table,
    (SELECT column_name FROM user_cons_columns WHERE constraint_name = c.r_constraint_name AND owner = c.r_owner) AS parent_key_column
FROM 
    user_constraints c
JOIN 
    user_cons_columns cc ON c.constraint_name = cc.constraint_name
WHERE 
    c.constraint_name = 'FK31_1';

这个查询能帮你明确:

  • 该外键属于哪张子表和哪一列
  • 它关联的父表以及父表的主键/唯一键列
  • 父表的所有者(如果是其他用户的表)

如果这个约束属于MYDBS用户(错误提示里的前缀),而你不是用该用户登录的,就换成all_constraints和all_cons_columns来跨用户查询:

SELECT 
    c.constraint_name,
    c.table_name AS child_table,
    cc.column_name AS child_fk_column,
    c.r_owner AS parent_owner,
    c.r_constraint_name AS parent_constraint_name,
    (SELECT table_name FROM all_constraints WHERE constraint_name = c.r_constraint_name AND owner = c.r_owner) AS parent_table,
    (SELECT column_name FROM all_cons_columns WHERE constraint_name = c.r_constraint_name AND owner = c.r_owner) AS parent_key_column
FROM 
    all_constraints c
JOIN 
    all_cons_columns cc ON c.constraint_name = cc.constraint_name AND c.owner = cc.owner
WHERE 
    c.constraint_name = 'FK31_1'
    AND c.owner = 'MYDBS';

拿到这些信息后,你就能检查操作的数据是否在父表有匹配值,或者父表是否误删了相关记录。

内容的提问来源于stack exchange,提问作者Mika Takaki

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.28 17:17:39