【问题标题】:Oracle - drop multiple table in a single queryOracle - 在单个查询中删除多个表
【发布时间】:2014-11-17 09:04:02
【问题描述】:

我的数据库中有 50 个表,因为我只需要 6 个表。

如何通过一个查询删除剩余的表?

【问题讨论】:

  • 如果我是你,我会导出六张表,删除所有内容,还原六张表。
  • 您没有像 SQL Developer 或 Toad 这样的工具吗?只需单击表格(如果您愿意,可以使用 shift 和 ctrl),然后单击 Drop。
  • @ThorstenKettner 我有 sql 开发人员,但问题是我可以选择多个表,但是在选择多个表后它没有给出“Drop”选项。
  • 哦,太糟糕了。对不起,我不知道。我认为所有这些工具都会提供这么简单的功能。我正在使用 Toad。
  • 最佳解决方案由@Raptor 给出:简单、快速、安全...

标签: oracle ddl


【解决方案1】:

您可以使用以下查询生成 DROP TABLE 命令列表:

SELECT 'DROP TABLE ' || table_name || ';' FROM user_tables;

之后,您删除要保留的六个表并执行其他命令。或者你在查询中添加一个WHERE table_name NOT IN (...) 子句。

希望对你有帮助。

【讨论】:

  • 运行时出现错误。SQL 错误:ORA-00942:表或视图不存在。我使用了这个查询 SELECT 'DROP TABLE ' ||表名 || ';'从 pmd_dba;这里 pmd_dba 是数据库
  • 不,你必须使用user_tables。这是您作为所有者的所有表的视图。
【解决方案2】:

使用类似的东西,因为在 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;
/

【讨论】:

  • 我还要添加级联约束
  • 我会使用user_tables 而不是all_tables。否则可能会在其他模式中删除同名的表(如果您有 DROP 权限)。
  • @Deepu 在 where 子句中我们可以使用 "not in" 运算符,然后我们将所有六个名字都放在那里?
  • @myself:好的,这是不可能的,因为在DROP TABLE 命令中没有模式名称。在最坏的情况下,它会导致错误,因为表已经被删除了,但这并不是那么悲惨:)
  • @vim 是的,应该可以
【解决方案3】:

要扩展答案, 对于 Oracle 10 及更高版本,删除的表不会被永久删除,而是移动到回收站。要真正删除表需要添加可选参数PURGE。

扩展接受的答案:

SELECT 'DROP TABLE ' || table_name || ' PURGE ;' DB_DEATH FROM user_tables;

【讨论】:

    【解决方案4】:

    首先使用您要保留的表名运行此查询。

    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 表查询。

    【讨论】:

      【解决方案5】:
      1. 从左侧列表中选择要删除的所有表。将它们拖放到您的工作表中。从弹出窗口中选择对象名称
      2. 按编辑菜单并选择替换。
      3. 在查找字段中键入逗号符号,
      4. 在替换字段中键入以下文本;\ndrop table 。注意单词表后面有一个空格。全部替换。
      5. 在第一张桌子之前输入 drop table ,在最后一张桌子之后输入 ;
      6. 您已准备好放下桌子。

      【讨论】:

        【解决方案6】:
        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;
        

        【讨论】:

          【解决方案7】:

          如果要保留的表是keep_tab1keep_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;  
          

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2013-12-05
            • 1970-01-01
            • 1970-01-01
            • 2011-10-09
            • 1970-01-01
            • 1970-01-01
            相关资源
            最近更新 更多