当有外键时的表删除数据,truncate与delete

当我们删除表里数据时,当此表主键作为外键时可能比较麻烦。特别是自关联的场合将非常麻烦(本表其他字段外键引用本表id)。
此时我们考虑到两个命令:truncate与delete。
truncate:是一个DDL语句,优点是效率高,在删除大表数据时很快。但一个很大的问题也是因为他是ddl语句,将会被自动提交事物,不可undo或者rollback。
delete:与truncate相反,delete命令可以回滚,但在删除数据的过程中将产生大量恢复信息以备rollback,所以将会很慢。

OK,回到我们的问题上来,现在我们如果想删除一个自表外键关联的所有数据,若直接truncate将会报:

ORA-02266: unique/primary keys in table referenced by enabled foreign keys

直接delete会报:

ORA-02292: integrity constraint (XXXUSER.FKNAME) violated - child record found

解决方法:
1、先暂时禁掉主键

SQL> ALTER TABLE T_XXXX DISABLE PRIMARY KEY CASCADE;
TABLE ALTERED.

2、删除数据,commit

SQL> DELETE FROM T_XXXXX;

3507 ROWS DELETED.

SQL> commit;

Commit complete.

3、重新启用主键

SQL> ALTER TABLE T_XXXXX ENABLE PRIMARY KEY;

TABLE ALTERED.

OK,数据被成功删除了。

posted @ 2013-05-18 17:57  大树的博客  Views(1415)  Comments(0Edit  收藏  举报