我正在使用Oracle DB来维护超过30个表,我要如何删除所有表中的数据?我只想删除数据而不是删除表格。
没有'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;
生成一个脚本来截断(=删除所有行)所有表:
select 'truncate table ' || table_name || ';' from user_tables
然后执行脚本。
truncate
是非事务性操作,也就是说它无法被回滚。 - Jeffrey KempBEGIN
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;
alter table ... disable all constraints
会抛出ORA-01735: invalid ALTER TABLE option
,这将导致脚本无法截断每个表,如果至少有一个表没有约束条件。您可能希望在begin .. exception
块中放置execute immediate
。 - René Nyffenegger对Andomar的答案进行了轻微变化,以截断特定用户的所有表,而不仅仅是当前用户的表:
SELECT 'TRUNCATE TABLE ' || owner || '.' || table_name || ';' FROM all_tables WHERE owner = 'user/schema'
user/schema
替换为您感兴趣的用户/模式(在引号之间)的名称。我使用上述提到的答案创建了这个存储过程。它完美地运行,没有任何错误或异常。
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;
删除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('已删除表数据:' || i.object_name); END LOOP; 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