我在数据库中有五十个表,因为我只需要六个表。
如何通过一个查询删除剩余的表?
答案 0 :(得分:20)
您可以使用以下查询生成DROP TABLE命令列表:
SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;
之后,删除要保留的六个表并执行其他命令。或者在查询中添加WHERE table_name NOT IN (...)
子句。
希望它有所帮助。
答案 1 :(得分:9)
使用类似的东西,因为在oracle中没有直接命令或方法来执行此操作
begin
for rec in (select table_name
from all_tables
where table_name like '%ABC_%'
)
loop
execute immediate 'drop table '||rec.table_name;
end loop;
end;
/
答案 2 :(得分:2)
要扩大答案, 对于Oracle 10及更高版本,删除的表不会永久删除,而是移动到回收站。要真正删除表,需要添加可选参数PURGE。
扩展接受的答案:
SELECT 'DROP TABLE ' || table_name || ' PURGE ;' DB_DEATH FROM user_tables;
答案 3 :(得分:1)
首先使用您要保留的表名运行此查询。
SELECT CONCAT( 'DROP TABLE ', GROUP_CONCAT(table_name) , ';' )
AS statement FROM information_schema.tables
WHERE table_schema = 'mydatabase' AND table_name not in ('table1', 'table2', 'table3');
此查询将为您提供DROP表查询。
答案 4 :(得分:0)
,
;\ndrop table
。请注意,单词表后面有一个空格。全部替换。drop table
,在最后一张桌子后输入;
。答案 5 :(得分:0)
DECLARE
TYPE bulk_array is table of ALL_TABLES.TABLE_NAME%type;
array bulk_array;
BEGIN
SELECT OWNER ||'.'|| TABLE_NAME BULK COLLECT
INTO array
FROM ALL_TABLES
WHERE TABLE_NAME LIKE '%%';--HERE U WILL PUT YOUR CONDITIONS.
FOR i IN array.FIRST..array.LAST LOOP
EXECUTE IMMEDIATE 'DROP TABLE '|| array(i) || ' PURGE'; --Specify PURGE if you want to drop the table and release the space associated
END LOOP;
END;
答案 6 :(得分:0)
如果要保留的表是keep_tab1
,keep_tab2
等,或以ASB开头。。
使用regexp_like
。这里只是为了展示regexp_like
的示例
即使在删除表之一时发生错误,循环仍会继续。
必须多次运行此脚本,因为在删除主表而不先删除参考表时可能会发生错误。
begin
for rec in (
select table_name from user_tables
where not
regexp_like(table_name, 'keep_tab1|keep_tab2|^ASB')
)
loop
begin
execute immediate 'drop table '||rec.table_name;
exception when others then
dbms_output.put_line(rec.table_name||':'||sqlerrm);
end;
end loop;
end;