0

过去,我将表格从复制old_schemanew_schema使用

create table if not exists {new_schema}.{lime_table} (like {old_schema}.{lime_table} including all);

复制/创建表结构和

insert into {new_schema}.{lime_table} (select * from {old_schema}.{lime_table});

用数据填充新表。现在,当我使用 pg_dump 将new_schema(其结构和数据)到 .sql 文件时

pg_dump.exe --host=<HOST> --port=<PORT> --username=<USER> -n old_schema --format=p --verbose <DATABASE> > C:\new_schema_dump.sql

我发现new_schema的表序列是指old_schema序列。例如,

CREATE TABLE new_schema.lime_settings_user (
    id integer DEFAULT nextval('old_schema.lime_settings_user_id_seq'::regclass) NOT NULL,
    ...
);

在 DBeaver 中检查new_schema时,我发现它没有序列,确认new_schema依赖于old_schema序列。这有点令人惊讶,因为来自https://www.postgresql.org/docs/9.1/sql-createtable.html

创建完成后新表和原表完全解耦

我的问题是:如何安全地以表格序列开头的new_schema自己的序列中给出表格?我不想从 1 开始,因为这些表已经在使用中。nextvalold_schemanew_schema

到目前为止,我已经考虑过执行以下操作。

  1. new_schema在with中创建一个新序列create sequence new_schema.lime_settings_user_id_seq owned by new_schema.lime_settings_user.id

  2. 设置序列start with参数 withselect setval('new_schema.lime_settings_user_id_seq'::regclass, (SELECT last_value + 1 FROM old_schema.lime_settings_user_id_seq))因为这不能start with在语句的子句中动态完成create sequence

  3. 用 .为new_schema' 表提供新的序列alter table 'new_schema.lime_settings_user alter column id set default nextval('new_schema.lime_settings_user_id_seq'::regclass)

有一个更好的方法吗?

4

0 回答 0