暂无图片
暂无图片
暂无图片
暂无图片
暂无图片
ORA-02292_主表在有子表外键约束的情况,如何快速批量删除和插入数据?
740
4页
12次
2020-06-04
免费下载
【引言】
最近接手一小活,求要将一张表中的数据进行全部更新,因表有
外键关联
无法删除
本表
数据
,即除有键的的数时,
oracle
会提
:ORA-02292:integrity constraint(xx)
violated - child record found
这种情况下咋个办?本文讲解之。
针对上述需求,有三种解决方案:
方案
1
不更改父表和子表约束条件的前提下先删除映射主表主键的相对应的子表
数据行后,删除父表中数据,接着对主表批量
insert
操作,因第一步子表中已删除的数据
业务还需使用,故最后一步需将子表中的对应的数据
insert
回子表。
此方法应用场景适用在主表需更新数据量少的情况下;难点是在主表数据量大的情况下
涉及到子表相应行的删除和回插操作很是繁琐,导致的业务中断时间较长,数据复核时
较长。
2
update
操作。如每行的更新列不统一,导致的
update
操作会异常繁多,不亚于方案
1
如因本案例中每行的更新列均不尽同,具体的
update
语句人工逐个更改,难度较大,
属拼体力劳动,故不推荐此法。
方案
3
先是的主表关联主键约束条件失效,删除主表中数据后,批
insert
数据后,再
让其主键约束生效。此方案可快速实现主表的批量删除、
insert
级联数据的需求。
经过比主原有据集待导数据集,新导的数集包现有数据,故
本文采用简单粗暴的方案
3
具体操作之前,先简介约束条件的启停命令和含义
:
enable( validate) :
启用约束
,
创建索引
,
对已有及新加入的数据执行约束。
enable novalidate :
启用约束
,
创建索引
,
仅对新加入的数据强制执行约束
,
而不管表中的现有数
据。
禁用约束
:
disable( novalidate):
关闭约束
,
删除索引
,
可以对约束列的数据进行修改等操作。
disable validate :
关闭约束
,
删除索引
,
不能对表进行插入
/
更新
/
删除等操作。
主键约束的相关知识点:
1.
建立唯一约束或主键索约束,会同时自动创建一个与之同名的索引;
2.
如果
disable
约束,与之对应的索引会自动删除掉;
3.
如想插入重复数据,要暂时违反或禁用唯一约束,后来再
enable
就会报违反唯一约束。
具体操作步骤如下:
1.
首先查询表
currency
表的数据量
ethan_user@ethanDB> select count(*) from currency;
COUNT(*)
----------
184
2.
先不做任何操作,执行下
delete
一行的操作,看下报错信息
ethan_user@ethanDB> delete from currency where CURRENCY_CODE='AED';
delete from currency where CURRENCY_CODE='AED'
*
ERROR at line 1:
ORA-02292: integrity constraint (ethan_user.FKCOUNTRY_CURRENCY) violated - child
record found
查看约束条件
ethan_user.FKCOUNTRY_CURRENCY
的具体信息
ethan_user@ethanDB> select constraint_name,constraint_type ,status,table_name from
user_constraints where constraint_name='FKCOUNTRY_CURRENCY';
CONSTRAINT_NAME
--------------------------------------------------------------------------------
C STATUS
- --------
TABLE_NAME
--------------------------------------------------------------------------------
FKCOUNTRY_CURRENCY
R ENABLED
COUNTRY
可以看出表
country
是表
currency
的子表,
constraint_type
为“
R
,即为外键约束。
ethan_user@ethanDB> select count(*) from country;
COUNT(*)
----------
248
3.
让父表的主键失效,从而让子表中的外键依赖关系失效
1.
)主键失效:
alter table table_name disable primary key cascade;
2.
)删除数据:
delete from table_name where id = 'xx';
3.
)主键重新生效:
alter table table_name enable primary key;
执行步骤如下:
步骤
1
:主键失效
通过如下主表
currency
的定义,查看主键约束为
CURRENCY_P
ethan_user@ethanDB> set pagesize 0
ethan_user@ethanDB> set long 9999
ethan_user@ethanDB> select dbms_metadata.get_ddl('TABLE','CURRENCY') from dual;
of 4
免费下载
【版权声明】本文为墨天轮用户原创内容,转载时必须标注文档的来源(墨天轮),文档链接,文档作者等基本信息,否则作者和墨天轮有权追究责任。如果您发现墨天轮中有涉嫌抄袭或者侵权的内容,欢迎发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论

关注
最新上传
暂无内容,敬请期待...
下载排行榜
Top250 周榜 月榜