Oracle表存在外键约束,无法truncate table,但delete table可以

问题原因

虽然truncate table在删除数据的速度上会占有一定的优势,但并不是在所有的情况我们都可以使用truncate,存在以下情况就使用truncate就会失败。
1,要删除数据的表包含foreign key约束(被其他表引用),而delete则可以通过级联删除来删除相关联的数据。
2,被索引视图引用过的表,也不能使用truncate。

解决方案

有外键的表只能用delete,不能用truncate,这是语法规定,要么就取消外键再truncate。
可以先禁用外键约束,删除完毕后,再启动外键约束。

查找外键关联
SELECT T1.TABLE_NAME,
       T2.TABLE_NAME AS "TABLE_NAME(R)",
       T1.CONSTRAINT_NAME,
       T1.R_CONSTRAINT_NAME AS "CONSTRAINT_NAME(R)",
       A1.COLUMN_NAME,
       A2.COLUMN_NAME AS "COLUMN_NAME(R)"
  FROM USER_CONSTRAINTS T1
 INNER JOIN USER_CONSTRAINTS T2 ON T1.R_CONSTRAINT_NAME =
                                   T2.CONSTRAINT_NAME
 INNER JOIN USER_CONS_COLUMNS A1 ON T1.CONSTRAINT_NAME = 
                                    A1.CONSTRAINT_NAME
 INNER JOIN USER_CONS_COLUMNS A2 ON T1.R_CONSTRAINT_NAME =
                                    A2.CONSTRAINT_NAME
 WHERE T2.TABLE_NAME = '要删的表名';
外键禁用/开启
--禁用约束:
alter table XXX disable constraint XXX;
--启用约束
alter table XXX enable constraint XXX;
实例

这里写图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值