在 Postgres 12 中,如何使用动态 SQL 将 PK 列更改为 IDENTITY?
In Postgres 12, how to change PK columns into IDENTITY using dynamic SQL?
所以我使用 pgloader 3.4.1 将我的数据库从 SQLite 迁移到 Postgres 12,由于某些原因,所有表中的 PK 列不是 sequential/auto-increment。它们被索引为 NOT NULL(正确)和 bigint 或 int(正确),但它们不包含默认值,因此我需要手动将它们更改为 IDENTITY 类型。
但是,我需要单独留下一些 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
查看模式时,它仍然没有默认值。
请帮忙?
错误在这一行:
is_generated = 'NO'
is_generated 只取“ALWAYS”或“NEVER”作为值。
我很幸运在 Postgres 文档中看到了这一点。
希望这对其他人有帮助!
所以我使用 pgloader 3.4.1 将我的数据库从 SQLite 迁移到 Postgres 12,由于某些原因,所有表中的 PK 列不是 sequential/auto-increment。它们被索引为 NOT NULL(正确)和 bigint 或 int(正确),但它们不包含默认值,因此我需要手动将它们更改为 IDENTITY 类型。
但是,我需要单独留下一些 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
查看模式时,它仍然没有默认值。
请帮忙?
错误在这一行:
is_generated = 'NO'
is_generated 只取“ALWAYS”或“NEVER”作为值。
我很幸运在 Postgres 文档中看到了这一点。
希望这对其他人有帮助!