如何在 Postgresql 中将序列从一个模式复制到另一个模式?

How can I copy sequences from one schema to another in Postgresql?

提问人:scrollout 提问时间:1/13/2022 最后编辑:scrollout 更新时间:3/23/2022 访问量:680

问:

目的是弄清楚在使用以下方法将表从架构 、 复制到新架构后如何执行此操作schema 1schema 2

create table if not exists {schema 2}.{lime_table} (like {schema 1}.{lime_table} including all);

insert into {schema 2}.{lime_table} (select * from {schema 1}.{lime_table});

使用此方法在架构之间复制表时,序列将指向 中的序列。为了删除依赖项/耦合,我使用一个脚本创建了相同的序列,该脚本使用了类似schema 2schema 1schema 1schema 2

create sequence
    if not exists {schema_2_dot_sequence_name}
    increment by 1
    minvalue 1
    maxvalue 2147483647
    start {start_with} -- taken from `schema 1`.sequence.last_val
    cache 1
    no cycle
    owned by {schema_2_dot_table_dot_id_field_name}
;

然后更改了 USING 中的 ID 列schema 2

alter table {schema_2_dot_table}
    alter column {id_field_name}
        set default nextval({schema_2_dot_sequence}::regclass)

在进行这些数据库更改后,我将我的应用程序 (Limesurvey) 指向 。schema 2

现在,当尝试将记录插入到 时,会抛出错误。如果我将我的应用程序指向(创建新的数据库连接/会话),我不会收到此错误,因此它使我认为我所做的序列“迁移”是错误的。该应用正在使用 php 函数 lastInsertIdschema 2currval of sequence "<sequence_name>" is not yet defined in this sessionschema 1

更新:我做了一个,但在输出中没有找到任何实例,所以也许我所做的迁移有效,并且应用程序中的某个地方有一个配置指向......pg_dumpschema 1schema 1

php postgresql 会话 序列 limesurvey

评论

0赞 wildplasser 1/13/2022
[取决于 Postgres 版本] (详见说明书)CREATE table xxx.aaa AS SELECT * FROM yyy.bbb INCLUDING ALL;

答:

0赞 scrollout 1/13/2022 #1

在查看了堆栈跟踪后,我发现了对正在制作的引用。例如,其中 是 。而且因为没有出现在 中,我知道这一定是应用程序配置的问题。我发现在 https://forums.limesurvey.org/forum/installation-a-update-issues/111790-installation-on-a-different-schema 的帮助下,代码库中有一些隐藏的字符串需要更改。这意味着我用于将表及其序列从一个架构迁移到另一个架构的方法有效。schema 1C:\...\CDbCommandBuilder.php(62): CDbConnection->getLastInsertID("public.lime_user_groups_ugid_seq")publicschema 1schema 1pg_dumpschema 1

更新:问题出在应用程序配置中。我们的数据库使用与两个 pg 服务器的 pgpool 连接。连接到池时产生了错误。它直接连接到主/主 pg 服务器后消失了。