SQL: 사용 가능한 모든 테이블에서 모든 데이터 삭제
오라클 DB를 사용하여 30개 이상의 테이블을 유지 관리하고 있는데, 모든 테이블에서 모든 데이터를 삭제하려면 어떻게 해야 합니까?데이터만 삭제하고 테이블은 삭제하지 않습니다.
'ALTER TABLE XXX DISABLE ALL CONSTARINGS' 명령이 없습니다.
이렇게 제안합니다.
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;
모든 테이블을 잘라낼 스크립트 생성(= 모든 행 제거):
select 'truncate table ' || table_name || ';' from user_tables
그런 다음 스크립트를 실행합니다.
제약 조건 문제를 해결하려면 다음과 같은 작업이 수행되어야 합니다.
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;
잘라내기의 잠재적인 단점은 참조 무결성 제약 조건에서 실패할 수 있다는 것입니다.따라서 먼저 외부 키 제약 조건을 사용하지 않도록 설정한 다음 잘라내기를 수행한 다음 제약 조건을 다시 사용하도록 설정합니다.스키마 복제(expand imp)의 '플러스'는 테이블 공간을 삭제하고 다시 만들 수 있다는 것입니다(모든 데이터를 제거한 결과로 일부 물리적 Disk 공간을 회수하려는 경우 이를 수행할 수 있습니다).
스키마를 복제한 다음 이전 테이블을 삭제하시겠습니까?
저는 위에 언급된 답변을 사용하여 이 저장 프로시저를 만들었습니다.이것은 오류나 예외 없이 완벽하게 작동합니다.
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;
현재 사용자의 테이블만 잘라내는 대신 특정 사용자의 테이블을 모두 잘라내는 Andomar의 답변에 약간의 변화가 있습니다.
SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema'
교체합니다.user/schema관심 있는 사용자/사용자의 이름(따옴표 사이)을 입력합니다.
오라클의 모든 테이블에서 모든 데이터 삭제
선언하다str VARCHAR2(100);시작한다.FOR i IN(object_name은 user_message WHERE object_type=에서 선택하십시오.'표')고리str := '테이블 잘라내기' || i.object_name;즉시 str을 실행합니다;DBMS_OUTPUT.PUT_LINE('table data deleted :' || i.object_name);
END 루프;끝;
자세한 내용은 http://www.oracleinformation.com/2014/10/delete-all-the-data-from-all-tables.html 에서 확인하시기 바랍니다.
이 두 줄 스크립트가 최고입니다.
EXEC sp_MSForEachTable 'ALTER TABLE ? NOCHECK CONSTRAINT ALL'
GO
EXEC sp_MSForEachTable 'DELETE FROM ?'
GO
언급URL : https://stackoverflow.com/questions/832160/sql-delete-all-the-data-from-all-available-tables
'programing' 카테고리의 다른 글
| 로컬 보석을 설치하려면 어떻게 해야 합니까? (0) | 2023.06.17 |
|---|---|
| Oracle SQL - NULL 값이 있는 max() (0) | 2023.06.17 |
| 동시 가방 대 목록 (0) | 2023.06.17 |
| 목록 모음에서 메서드 선택 (0) | 2023.06.17 |
| 테이블에 명명된 검사 제약 조건 추가 (0) | 2023.06.12 |