Oracle中外键禁用后不同查询返回状态不一致的问题求助
Oracle中外键禁用后不同查询返回状态不一致的问题求助
问题原因分析
嘿,这个问题其实是你的第一个查询逻辑搞错了!咱们来拆解下:
你第一个查询里,b表关联的是外键引用的主键约束(也就是customers_pk和items_pk),而你SELECT的b.status是主键约束的状态,不是外键约束本身的状态!而且你还加了WHERE b.status = 'ENABLED'的过滤条件——但你禁用的是外键约束(类型为R的约束),主键约束(类型为P)根本没被改动,一直都是ENABLED状态,所以这个查询自然会一直显示ENABLED,但这完全不是外键的真实状态!
而第二个查询直接查询了user_constraints中类型为R(外键)的约束的status字段,这才是外键本身的状态,所以显示DISABLED是正确的,和你执行的禁用操作一致。
修正后的查询
如果你想通过关联主键约束的方式查询外键状态,应该取外键自己的状态(a.status),而不是主键的状态,同时可以去掉不必要的b.status过滤(或者如果需要关联主键状态可以保留,但别用来过滤外键):
SELECT '"' || a.owner || '"."' || a.table_name || '"' AS full_table_name, a.constraint_name, a.status -- 这里取外键约束自身的状态 FROM user_constraints a JOIN user_constraints b ON ( a.r_constraint_name = b.constraint_name AND a.r_owner = b.owner ) WHERE a.constraint_type = 'R' ORDER BY 1
执行这个修正后的查询,就能看到外键的真实状态(DISABLED)了。
额外小建议
另外,你的禁用外键的PL/SQL代码其实是没问题的,它确实成功禁用了外键。如果想更直观地验证,也可以直接用第二个查询(或者上面修正后的查询)来确认状态,避免因为查询逻辑错误导致的误解。
备注:内容来源于stack exchange,提问作者Pugzly
相关产品推荐
相关产品推荐

