如何在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
相关产品推荐
相关产品推荐

