关于oracle删除外键的问题,看看下面的语句为啥不能执行。

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于oracle删除外键的问题,看看下面的语句为啥不能执行。相关的知识,希望对你有一定的参考价值。

Begin
for t in (select * from user_constraints ) loop
execute immediate 'alter table '||t.table_name||' drop constraint '||t.constraint_name||' and constraint_type=R;';
end loop;
报这样的错误

Error starting at line 1 in command:
Begin
for t in (select * from user_constraints ) loop
execute immediate 'alter table '||t.table_name||' drop constraint '||t.constraint_name||' and constraint_type=R;';
end loop;
end;
Error report:
ORA-01735: 无效的 ALTER TABLE 选项
ORA-06512: 在 line 3
01735. 00000 - "invalid ALTER TABLE option"
*Cause:
*Action:
end;
怎么解决?
是执行这个语句
Begin
for t in (select * from user_constraints ) loop
execute immediate 'alter table '||t.table_name||' drop constraint '||t.constraint_name||' and constraint_type=R;';
end loop;
end;

参考技术A 先别说你循环执行了,你就是单独一个拿出来你看能执行不?肯定不行嘛
哪有在alter选项后加and constraint_type=R,要加也只能加到你的寻坏的查询里
for t in (select * from user_constraints where constraint_type='R') loop
参考技术B Begin
for t in (select * from user_constraints where constraint_type='R') loop
execute immediate 'alter table '||t.table_name||' drop constraint '||t.constraint_name||'';
end loop;end;本回答被提问者采纳

给已有数据的oracle表建立外键关系

PS:这里是给自己做个备忘,下次遇到同类问题的时候,方便查找;

  客户在有主外键关系的2张表进行页面删除时报错已有子记录,运维后台处理的时候应该找出相应的数据,先删除子记录,在删主表记录;但客户要的急,就执行了错误的操作,删除了外键约束,在执行的删除,但在通过alter语句进行添加外键的时候,报错未找到父项关键字;

网上搜索了下,说未找到父项关键字的原因是2张表的数据不统一,后通过minus关键字查询2张表的差值,确实存在;

在google之后发现了2种方法可以解决:

  1、删除多余的数据,保持2张表数据统一,在执行 alter table 表1 add constraint FK_XXX foreign key(字段1)  references 表2 (字段2);就不会报错了;

(ps:这种方式在实际生产过程中不实际,生产环境数据不能随便删除的,所以这种方式不现实,不推荐)

  2、在alter语句之后加上enable novalidate即可,即

alter table 表1 add constraint FK_XXX foreign key(字段1)  references 表2 (字段2) enable novalidate;

(ps:enable novalidate指的是允许已有记录不满足约束条件,但新增/修改的记录则必须满足约束条件)

这是其他3种的含义:

  Enable Validate与Enable相同,检查已有记录和新增记录,确保都符合约束;

  Disable Validate禁用约束,删除约束上的索引,不允许修改任何被约束的记录;

  Disable Novalidate与Disable相同,禁用约束,删除约束上的索引,且允许修改被约束的记录。
---------------------
关于oracle约束关键字Enable/Disable/Validate/Novalidate的详情,可以查看这篇原文,传送门
原文:https://blog.csdn.net/huang_xw/article/details/6396846






以上是关于关于oracle删除外键的问题,看看下面的语句为啥不能执行。的主要内容,如果未能解决你的问题,请参考以下文章

mysql为啥被设了外键的表还能被删掉?

oracle数据库设置外键问题

当您在 Oracle 中删除附加了外键的主键约束然后重新启用主键时会发生啥?

sql 删除带外键约束的表的语句是啥

oracle怎么查看外键在哪个表

给已有数据的oracle表建立外键关系