В Postgres 12, как изменить столбцы PK в IDENTITY с помощью Dynami c SQL? - PullRequest
0 голосов
/ 11 июля 2020

Итак, я перенес свою базу данных с SQLite на Postgres 12 с помощью pgloader 3.4.1, и по какой-то причине столбцы PK во всех таблицах не являются последовательными / автоматически увеличиваются. Они проиндексированы как NOT NULL (правильные) и bigint или int (правильные), но они не содержат значения по умолчанию, поэтому мне нужно вручную изменить их на тип IDENTITY.

Однако мне нужно оставьте в покое некоторые столбцы PK varchar.

До сих пор я пробовал это в 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 для просмотра схемы, он все равно не имеет значения по умолчанию.

Помогите, пожалуйста?

1 Ответ

0 голосов
/ 18 июля 2020

Ошибка заключается в этой строке:

is_generated = 'NO'

is_generated принимает в качестве значений только «ВСЕГДА» или «НИКОГДА».

Мне посчастливилось уловить это в Postgres документация.

Надеюсь, это поможет кому-то другому!

...