提问人:scrollout 提问时间:1/13/2022 最后编辑:scrollout 更新时间:3/23/2022 访问量:680
如何在 Postgresql 中将序列从一个模式复制到另一个模式?
How can I copy sequences from one schema to another in Postgresql?
问:
目的是弄清楚在使用以下方法将表从架构 、 复制到新架构后如何执行此操作schema 1
schema 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 2
schema 1
schema 1
schema 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 函数 lastInsertId。schema 2
currval of sequence "<sequence_name>" is not yet defined in this session
schema 1
更新:我做了一个,但在输出中没有找到任何实例,所以也许我所做的迁移有效,并且应用程序中的某个地方有一个配置指向......pg_dump
schema 1
schema 1
答:
在查看了堆栈跟踪后,我发现了对正在制作的引用。例如,其中 是 。而且因为没有出现在 中,我知道这一定是应用程序配置的问题。我发现在 https://forums.limesurvey.org/forum/installation-a-update-issues/111790-installation-on-a-different-schema 的帮助下,代码库中有一些隐藏的字符串需要更改。这意味着我用于将表及其序列从一个架构迁移到另一个架构的方法有效。schema 1
C:\...\CDbCommandBuilder.php(62): CDbConnection->getLastInsertID("public.lime_user_groups_ugid_seq")
public
schema 1
schema 1
pg_dump
schema 1
更新:问题出在应用程序配置中。我们的数据库使用与两个 pg 服务器的 pgpool 连接。连接到池时产生了错误。它直接连接到主/主 pg 服务器后消失了。
评论
CREATE table xxx.aaa AS SELECT * FROM yyy.bbb INCLUDING ALL;