postgresql—在postgres 12中,如何使用动态sql将pk列更改为标识?

o2g1uqev  于 2021-07-24  发布在  Java
关注(0)|答案(1)|浏览(353)

因此,我使用pgloader3.4.1将数据库从sqlite迁移到postgres12,由于某些原因,所有表中的pk列不是连续/自动递增的。它们的索引为notnull(correct)和bigint或int(correct),但它们不包含默认值,因此我需要手动将它们更改为标识类型。
但是,我需要留下一些varchar pk列。
到目前为止,我已经在psql中尝试过:

do
$$
declare
  l_rec record;
  l_sql text;
  l_table text;
begin
  for l_rec in select table_schema, table_name, column_name, data_type, is_nullable
               from information_schema.columns
               where data_type in ('bigint', 'integer')
                 and is_nullable = 'NO' 
                 and is_generated = 'NO'
                 and is_identity = 'NO'
  loop
    l_sql := format('alter table %I.%I alter %I add generated always as identity', 
                     l_rec.table_schema, 
                     l_rec.table_name, 
                     l_rec.column_name);                 
    execute l_sql;
    l_table := concat(quote_ident(l_rec.table_schema), '.', quote_ident(l_rec.table_name));
    l_sql := format('select setval(pg_get_serial_sequence(%L, %L), max(%I)) from %I.%I', 
                    l_table, 
                    quote_ident(l_rec.column_name), 
                    l_rec.column_name, 
                    l_rec.table_schema, 
                    l_rec.table_name);
    execute l_sql;
  end loop;
end;  
$$
;

它会吐出“do”,所以我想它一定有用,但是当我使用 \d table_name 要查看架构,它仍然没有默认值。
请帮忙?

rkttyhzu

rkttyhzu1#

错误在于这一行:

is_generated = 'NO'

is\u generated只取“always”或“never”作为值。
我很幸运在postgres的文档中看到了这一点。
希望这能帮助别人!

相关问题