SQL:删除所有可用表中的所有数据

Lil*_*ily 25 sql oracle

我使用oracle DB来维护30多个表,如何删除所有表中的所有数据?我只想删除数据但不删除表.

小智 32

没有命令'ALTER TABLE XXX DISABLE ALL CONSTRAINTS'

我提议这个;

BEGIN
  FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
  LOOP
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' disable constraint ' || c.constraint_name);
  END LOOP;
  FOR c IN (SELECT table_name FROM user_tables)
  LOOP
    EXECUTE IMMEDIATE ('truncate table ' || c.table_name);
  END LOOP;
  FOR c IN (SELECT table_name, constraint_name FROM user_constraints WHERE constraint_type = 'R')
  LOOP
    EXECUTE IMMEDIATE ('alter table ' || c.table_name || ' enable constraint ' || c.constraint_name);
  END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)

  • 这个解决方案可能不是投票最多的,因为人们不在乎阅读这里的所有答案. (2认同)

And*_*mar 29

生成一个脚本以截断(=删除所有行)所有表:

select 'truncate table ' || table_name || ';' from user_tables
Run Code Online (Sandbox Code Playgroud)

然后执行脚本.

  • 如果定义了外键 - 主键约束,则无效. (8认同)
  • 仅适用于新手:请注意`truncate`是非事务性的,即无法回滚. (6认同)
  • 我确实编辑了这个答案,抱歉,但all_tables的事情非常危险. (5认同)

DCo*_*kie 18

要解决约束问题,这样的事情应该有效:

BEGIN

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' DISABLE ALL CONSTRAINTS';
    END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
    END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      EXECUTE IMMEDIATE 'ALTER TABLE '||T.table_name||' ENABLE ALL CONSTRAINTS';
    END LOOP;
END;
Run Code Online (Sandbox Code Playgroud)