SQL: удалить все данные из всех доступных таблиц - PullRequest
25 голосов
/ 07 мая 2009

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

Ответы [ 9 ]

32 голосов
/ 14 июня 2012

Нет команды 'ALTER TABLE XXX ОТКЛЮЧИТЬ ВСЕ ОГРАНИЧЕНИЯ'

Я предлагаю это;

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;
29 голосов
/ 07 мая 2009

Создание сценария для усечения (= удаления всех строк) всех таблиц:

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

А затем выполните скрипт.

18 голосов
/ 07 мая 2009

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

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 голосов
/ 07 мая 2009

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

2 голосов
/ 07 мая 2009

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

1 голос
/ 12 февраля 2018

Небольшое отклонение в ответе Andomar на усечение всех таблиц для определенного пользователя, а не только для текущего пользователя:

SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema'

Замените бит user/schema выше на имя пользователя / схемы (между кавычками), которые вас интересуют.

1 голос
/ 12 сентября 2016

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

    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;
0 голосов
/ 12 августа 2016

Удалить все данные из всех таблиц в 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

0 голосов
/ 01 сентября 2012

эти два строчных скрипта являются лучшими

EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO

EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...