在《Powdersigner + PostgreSql 同步表结构到pg数据库》中,导入表结构到pg数据后,发下时间对不上了。mysql的datetime转换后pg的变成了date了。 再同步到数据后,就变成日期类型了。 因为表中基本都有创建时间和修改时间,两个相对固定的字段,因此想做一个统一的处理。
把《postgreSql使用||拼接sql实现一次性修改库里面所有字段的属性_pg修改字段属性_友妖气的博客-CSDN博客》 和《Postgresql 如何查出一个表/所有表的所有列名_iteapoy的博客-CSDN博客》重新做一个梳理
《Postgresql学习文档》
1,查出当前库里面的表格字段:
-- 所有表字段
select * from information_schema.columns;
-- 只查公共的表字段
select * from information_schema.columns
where table_schema='public' and table_name<>'pg_stat_statements';
2,根据类型过滤字段:
select * from information_schema.columns
where table_schema='public' and table_name<>'pg_stat_statements'
and data_type = 'date';
3,pg修改字段类型:
ALTER TABLE table_name ALTER COLUMN column_name DATA TYPE datatype;
4,拼接要修改表名和字段
SELECT 'ALTER table '||table_name||' alter COLUMN '|| column_name ||
' SET DATA TYPE timestamp ;' FROM information_schema.columns
where table_schema='public' and table_name<>'pg_stat_statements'
and data_type = 'date'
order by table_name ;
执行后,得到修改类型的语句,可以导出来,再执行。
5,再拼接到一起array_to_string
不导出来的话,可以再拼接,
select array_to_string(array_agg(sqls), ' ') from (
SELECT 'ALTER table '||table_name||' alter COLUMN '||column_name||
' SET DATA TYPE timestamp ;' as sqls
FROM information_schema.columns
where table_schema='public'
and table_name<>'pg_stat_statements'
and data_type = 'date'
order by table_name
) as temp;
再把内容复制出来,格式化下,再执行。
注意:
如果时间是有用date类型的,再根据字段名称进行一个过滤,特殊话处理!
总结:
如果有碰到需要统一修改固定表字段类型的,可以用这样的方法去处理,比较省事。