zoukankan      html  css  js  c++  java
  • 当有外键时的表删除数据,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,数据被成功删除了。

  • 相关阅读:
    索引器
    异常
    C#各版本
    构造函数
    值类型和引用类型
    面向对象聊天机器人
    linux 系统快捷键
    linux 系统常用设置
    linux 系统介绍
    linux 命令学习.txt
  • 原文地址:https://www.cnblogs.com/radio/p/3085730.html
Copyright © 2011-2022 走看看