因业务要求,需要对现有的数据库中所有含is_deleted字段的表添加delete_time字段。

1.查询出所有含is_deleted字段的表(ps:多个库多个表)

SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_COMMENT,TABLE_NAME,TABLE_SCHEMA,(CONCAT(TABLE_SCHEMA,'.',TABLE_NAME)) as '库名+表名' 
FROM information_schema.COLUMNS 
WHERE 
TABLE_NAME in (
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA  in ('库名','xx1','xx2','xx3')
) 
and COLUMN_NAME='is_deleted' 
and TABLE_SCHEMA  in ('库名','xx1','xx2','xx3')
ORDER BY TABLE_SCHEMA

使用sql说明

-- 查询库的表
-- SELECT TABLE_NAME,TABLE_TYPE,TABLE_COMMENT,CREATE_TIME,UPDATE_TIME FROM information_schema.TABLES WHERE TABLE_SCHEMA = '库名'
SELECT TABLE_NAME,TABLE_SCHEMA FROM information_schema.TABLES WHERE TABLE_SCHEMA in ('库名','xx1','xx2','xx3')

-- 查询表的字段
-- SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_COMMENT FROM information_schema.COLUMNS WHERE TABLE_NAME='表名'
SELECT COLUMN_NAME,DATA_TYPE,CHARACTER_MAXIMUM_LENGTH,IS_NULLABLE,COLUMN_COMMENT,TABLE_NAME FROM information_schema.COLUMNS WHERE TABLE_NAME='xxx'

ps:查询出所有含is_deleted的表后,因为有些表中含有delete_time,需要对其去重。

2.sql说明(在表中的is_deleted字段后插入delete_time字段 类型长度备注···)

ALTER TABLE 库名.表名  ADD COLUMN `delete_time` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '数据删除时间戳:默认为0,未删除' AFTER `is_deleted`;

3.查询表中不包含 key的表

-- 查询表中不包含 key的表
SELECT
TABLE_SCHEMA,TABLE_NAME,
(CONCAT(TABLE_SCHEMA,'.',TABLE_NAME)) as '库名+表名' 
FROM (
-- 查询所有表
SELECT * FROM information_schema.TABLES WHERE TABLE_SCHEMA  in ('库名')
) a
WHERE 
(CONCAT(TABLE_SCHEMA,'.',TABLE_NAME)) not in  (
-- 查询所有包含key的表
SELECT
(CONCAT(TABLE_SCHEMA,'.',TABLE_NAME))
FROM information_schema.COLUMNS 
WHERE 
TABLE_NAME in (
SELECT TABLE_NAME FROM information_schema.TABLES WHERE TABLE_SCHEMA  in ('库名')
) 
and COLUMN_NAME = 'key' 
and TABLE_SCHEMA  in ('wit_ccp_nmg')
ORDER BY  TABLE_SCHEMA
)
-- 效率 locate > position > like
-- binary 区分大小写
and binary locate('copy',TABLE_NAME)=0 -- 匹配到数量

EXCEL方式:

1.将查询出来的表名复制到excel中

2.拼接sql语句(“xx”&A1&"xx"),然后复制拼接后的sql语句放入数据库中执行

="ALTER TABLE "&A1&"  ADD COLUMN `delete_time` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '数据删除时间戳:默认为0,未删除' AFTER `is_deleted`;"

直接使用sql方式:

-- 循环表名拼接sql语句
待定

其他脚本语句方式:

写for循环拼接
ps:java方式查询符合的表和筛选不需要插入的表都直接写到方法中,然后拼接成一个字符串形式的sql语句或在xml中用for循环该表集合拼接sql。
(查询出表集合-筛选-拼接sql后执行该sql或在mybatis中xml循环拼接-执行)
  StringBuffer xxx = new StringBuffer();
  for (int i = 0; i < list; i++) {
    xxx.append("ALTER TABLE "+list.table+"  ADD COLUMN `delete_time` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '数据删除时间戳:默认为0,未删除' AFTER `is_deleted`;");
  }


<!--未测试-->
<updateid="addColumn" parameterType="java.util.ArrayList">
  <foreach collection="list" item="o" separator=";">
    ALTER TABLE #{o.table}  ADD COLUMN `delete_time` bigint(20) UNSIGNED NOT NULL DEFAULT 0 COMMENT '数据删除时间戳:默认为0,未删除' AFTER `is_deleted`;
  </foreach>
</update>