当有外键时的表删除数据,truncate与delete
当我们删除表⾥数据时,当此表主键作为外键时可能⽐较⿇烦。特别是⾃关联的场合将⾮常⿇烦(本表其他字段外键引⽤本表id)。
此时我们考虑到两个命令:truncate与delete。
truncate:是⼀个DDL语句,优点是效率⾼,在删除⼤表数据时很快。但⼀个很⼤的问题也是因为他是ddl语句,将会被⾃动提交事物,不可undo或者rollback。
delete:与truncate相反,delete命令可以回滚,但在删除数据的过程中将产⽣⼤量恢复信息以备rollback,所以将会很慢。
OK,回到我们的问题上来,现在我们如果想删除⼀个⾃表外键关联的所有数据,若直接truncate将会报:
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,数据被成功删除了。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。