我们的项目出于测试、演示或者研发自己觉得清爽的原因,经常需要清除数据库中的数据。
但是表间定义了大量的外键关联,删除数据还需要遵从一定的业务关系,非常麻烦。
我们的小伙伴通常都是Drop user xxx cascade;然后找到初始化脚本重新来过。
其实可以在删除表数据之前,先禁用外键约束,删除之后,再启动约束。
首先,创建雇员表和部门表,并且创建一个外键约束。
SQL> create table emp as select * from hr.employees;
表已创建。
SQL> create table dept as select * from hr.departments;
表已创建。
SQL> alter table emp add constraints pk_emp primary key (employee_id);
表已更改。
SQL> alter table dept add constraints pk_dept primary key (department_id);
表已更改。
SQL> alter table emp add constraints fk_dept foreign key (department_id) references dept(department_id);
表已更改。
部门表不能先于雇员删除,否则报错。
SQL> delete from dept;
delete from dept
*
第 1 行出现错误:
ORA-02292: 违反完整约束条件 (LIHUILIN.FK_DEPT) - 已找到子记录
SQL> truncate table dept;
truncate table dept
*
第 1 行出现错误:
ORA-02266: 表中的唯一/主键被启用的外键引用
创建禁用约束的命令
-
SQL> select 'alter table '||table_name||' disable constraint '||constraint_name||';' from user_constraints;
-
-
\'ALTERTABLE\'||TABLE_NAME||\'DISABLECONSTRAINT\'||CONSTRAINT_NAME||\';\'
-
--------------------------------------------------------------------------------
-
alter table EMP disable constraint SYS_C0011146;
-
alter table EMP disable constraint SYS_C0011147;
-
alter table EMP disable constraint SYS_C0011148;
-
alter table EMP disable constraint SYS_C0011149;
-
alter table DEPT disable constraint SYS_C0011150;
-
alter table EMP disable constraint FK_DEPT;
-
alter table EMP disable constraint PK_EMP;
-
alter table DEPT disable constraint PK_DEPT;
-
-
已选择8行。
执行命令禁用约束,然后创建删除数据的命令。
-
SQL> select 'truncate table '||table_name||';' from user_tables;
-
-
\'TRUNCATETABLE\'||TABLE_NAME||\';\'
-
----------------------------------------------
-
truncate table DEPT;
-
truncate table EMP;
执行Truncate命令,最后启用约束
-
SQL> truncate table DEPT;
-
-
表被截断。
-
-
SQL> truncate table EMP;
-
-
表被截断。
-
-
-
SQL> select 'alter table '||table_name||' enable constraint '||constraint_name||';' from user_constraints;
-
-
\'ALTERTABLE\'||TABLE_NAME||\'ENABLECONSTRAINT\'||CONSTRAINT_NAME||\';\'
-
--------------------------------------------------------------------------------
-
alter table EMP enable constraint SYS_C0011146;
-
alter table EMP enable constraint SYS_C0011147;
-
alter table EMP enable constraint SYS_C0011148;
-
alter table EMP enable constraint SYS_C0011149;
-
alter table DEPT enable constraint SYS_C0011150;
-
alter table EMP enable constraint PK_EMP;
-
alter table DEPT enable constraint PK_DEPT;
-
alter table EMP enable constraint FK_DEPT;
-
-
已选择8行。
关于约束的命令
ALTER TABLE table_name ENABLE/DISABLE/DROP CONSTRAINT constraint_name;
关于索引的命令
ALTER INDEX index_name VISABLE/INVISABLE/REBUILD/REBUILD ONLINE/UNUSABLE;
来自 “ ITPUB博客 ” ,链接:https://blog.itpub.net/29254281/viewspace-776260/
,如需转载,请注明出处,否则将追究法律责任。