Подтвердить что ты не робот

SQL: удалить все данные из всех доступных таблиц

Я использую Oracle для поддержки более 30 таблиц, как я могу удалить все данные из всех таблиц? Я хочу только удалить данные, но не отбрасывать таблицы.

4b9b3361

Ответ 1

Создайте script, чтобы обрезать (= удалить все строки из) всех таблиц:

select 'truncate table ' || table_name || ';' from user_tables

И затем выполните script.

Ответ 2

Нет команды "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;

Ответ 3

Чтобы решить проблему ограничений, должно получиться что-то вроде этого:

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;

Ответ 4

Потенциальный недостаток с усечением заключается в том, что он может терпеть неудачу при ограничениях ссылочной целостности. Таким образом, вы хотите сначала отключить внешние ограничения ключей, затем выполнить усечение, а затем снова включить ограничения. "Плюс" с клонированием схемы (exp и imp) заключается в том, что вы также можете отбросить и воссоздать табличное пространство (что вы, возможно, захотите сделать, если хотите восстановить некоторое физическое дисковое пространство в результате удаления всех данных).

Ответ 5

Клонировать схему, а затем отбросить старые таблицы?

Ответ 6

Я создал эту сохраненную процедуру, используя ответы, упомянутые выше. Это отлично работает без каких-либо ошибок или исключений.

    create or replace PROCEDURE DELETE_ALL_DATA
AS 
cursor r1 is select * from user_constraints;
cursor r2 is select * from user_tables;
cursor r3 is select * from user_constraints;
cursor r4 is select * from user_tables;

BEGIN

    FOR c1 IN r1
  loop
    for c2 in r2
    loop
        begin
       if c1.table_name = c2.table_name and c1.status = 'ENABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' disable constraint ' || c1.constraint_name);
       end if;
        EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    end loop;
  END LOOP;

    FOR T in (SELECT table_name FROM user_tables) LOOP
      begin
      EXECUTE IMMEDIATE 'TRUNCATE TABLE '||T.table_name;
      EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    END LOOP;

    FOR c1 IN r3
  loop
    for c2 in r4
    loop
        begin
       if c1.table_name = c2.table_name and c1.status = 'DISABLED' THEN
        dbms_utility.exec_ddl_statement('alter table ' || c1.owner || '.' || c1.table_name || ' enable constraint ' || c1.constraint_name);
       end if;
        EXCEPTION
         WHEN NO_DATA_FOUND
           THEN
           continue;
         WHEN OTHERS 
           THEN
           continue;
           end;
    end loop;
  END LOOP;

    commit;
END DELETE_ALL_DATA;

Ответ 7

Удалить все данные из всех таблиц в oracle

DECLARE
  str VARCHAR2(100);
BEGIN
  FOR i IN
  (SELECT object_name FROM user_objects WHERE object_type='TABLE'
  )
  LOOP
    str := 'Truncate table '|| i.object_name;
    EXECUTE IMMEDIATE str;
    DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name);
  END LOOP;
END;

За дополнительной информацией: http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html

Ответ 8

эти две строки script являются лучшими

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

EXEC sp_MSForEachTable 'DELETE FROM ?'
GO