用SQL生成SQL

    遇到需要批量删除数据中的表的问题,二十来个表,手写DROP TABLE 太麻烦了,虽然现在有很多前端工具都有类似功能,但也需要点N次鼠标后才能完成,要是有外键更麻烦。可以用Python等脚本完,但我想最简单的还是用SQL生 成DROP TABLE语句,在此分享一下。
    用SQL生所DROP TABLE 语句的思路是,只要能从SELECT语句中得到表名即可用以下得到需要的删除脚本
    select concat('DROP TABLE ', tablename) from ........
   

    在MySQL中的
information_schema.tables中得到所有的表名, 所在通过加上数据库条件,就能得到要操作的数据库中的所有表
    show tables也可以得到当前数据库的所有表,但不能(或许是我不知道 ) 用于select中,如果你知道,麻烦告诉我一声


    以下语句生成删除test库中的所有表的脚本并保存在c:/drop.sql中
    

mysql>SELECT  
                      CONCAT('drop table ', table_name,';')  
                      INTO OUTFILE 'c:/drop.sql' 
            FROM 
                     information_schema.tables s 
            WHERE 
                     s.TABLE_SCHEMA='test';

 


drop.sql中的内容类似:

 

    drop table b;
    drop table c;
    drop table m;

 

    
    然后执行删除脚本:
    
        
  mysql>source  c:/drop.sql

     以上例子中的表之间没有主外键约束可以直接删除,如果有主外键约束,可以先删除把外键约束删除,Mysql中约束信息在
    information_schema.TABLE_CONSTRAINTS 表中,也可以生成删除外键的语句
    
     “ alter table
          tablename
       drop
          foreign key foreign-key-name; ”

比如JBPM的表有很多外键约束,可以用以下SQL生成删除JBPM数据库中的所有外键


SELECT
    CONCAT('alter table ',fk.TABLE_NAME, ' drop foreign key ', fk.CONSTRAINT_NAME,';')
FROM
    information_schema.TABLE_CONSTRAINTS fk
WHERE
    fk.CONSTRAINT_SCHEMA='JBPM' AND fk.CONSTRAINT_TYPE='foreign key';


 


执行以上SQL可以生成删除外键的外键的脚本drop_fk.sql

再生成删除表的脚本:


SELECT
    CONCAT('drop table ',t.TABLE_NAME,';')
    INTO OUTFILE 'c:/drop.sql'
FROM
    information_schema.TABLES t
WHERE t.table_schema='jbpm'; 

 


执行删除:


SQL> source c:/drop_fk.slq
SQL> source c:/drop.sql

 


Oracle中可以

    

select 'DROP TABLE' || table_name || ';' from user_tables;

生成删除表的脚本

 

oracle不熟悉,才开始学习,以后补上。

你可能感兴趣的:(oracle,sql,mysql,jbpm,脚本)