如何在 Postgresql 中将序列从一个模式复制到另一个模式?
How can I copy sequences from one schema to another in Postgresql?
objective 是在将表从架构 schema 1
复制到新架构 schema 2
后,使用以下方法弄清楚如何执行此操作[=28] =]
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
删除 dependencies/coupling,我在 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}
;
然后使用
更改了schema 2
中的id列
alter table {schema_2_dot_table}
alter column {id_field_name}
set default nextval({schema_2_dot_sequence}::regclass)
进行这些数据库更改后,我将我的应用程序 (Limesurvey) 指向 schema 2
。
现在,当尝试将记录插入 schema 2
时,会抛出错误 currval of sequence "<sequence_name>" is not yet defined in this session
。如果我将我的应用程序指向 schema 1
(创建新数据库 connection/session),我不会收到此错误,所以这让我认为我执行的“迁移”序列是错误的。该应用正在使用 php 函数 lastInsertId。
更新: 我做了一个 pg_dump
并没有在输出中找到 schema 1
的任何实例,所以也许我所做的迁移工作在那里是应用程序某处指向 schema 1
...
的配置
查看堆栈跟踪后,我发现了对 schema 1
的引用。例如,C:\...\CDbCommandBuilder.php(62): CDbConnection->getLastInsertID("public.lime_user_groups_ugid_seq")
,其中 public
是 schema 1
。因为 schema 1
没有出现在 pg_dump
中,我知道这一定是应用程序配置的问题。我发现在 https://forums.limesurvey.org/forum/installation-a-update-issues/111790-installation-on-a-different-schema 的帮助下,代码库中有一些隐藏的 schema 1
字符串需要更改。这意味着我用于 migrate/copy 表及其从一个模式到另一个模式的序列的方法有效。
更新:问题出在应用程序配置中。我们的数据库使用与两个 pg 服务器的 pgpool 连接。连接到池会产生错误。直接连接到 main/master pg 服务器后它就消失了。
objective 是在将表从架构 schema 1
复制到新架构 schema 2
后,使用以下方法弄清楚如何执行此操作[=28] =]
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
删除 dependencies/coupling,我在 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}
;
然后使用
更改了schema 2
中的id列
alter table {schema_2_dot_table}
alter column {id_field_name}
set default nextval({schema_2_dot_sequence}::regclass)
进行这些数据库更改后,我将我的应用程序 (Limesurvey) 指向 schema 2
。
现在,当尝试将记录插入 schema 2
时,会抛出错误 currval of sequence "<sequence_name>" is not yet defined in this session
。如果我将我的应用程序指向 schema 1
(创建新数据库 connection/session),我不会收到此错误,所以这让我认为我执行的“迁移”序列是错误的。该应用正在使用 php 函数 lastInsertId。
更新: 我做了一个 pg_dump
并没有在输出中找到 schema 1
的任何实例,所以也许我所做的迁移工作在那里是应用程序某处指向 schema 1
...
查看堆栈跟踪后,我发现了对 schema 1
的引用。例如,C:\...\CDbCommandBuilder.php(62): CDbConnection->getLastInsertID("public.lime_user_groups_ugid_seq")
,其中 public
是 schema 1
。因为 schema 1
没有出现在 pg_dump
中,我知道这一定是应用程序配置的问题。我发现在 https://forums.limesurvey.org/forum/installation-a-update-issues/111790-installation-on-a-different-schema 的帮助下,代码库中有一些隐藏的 schema 1
字符串需要更改。这意味着我用于 migrate/copy 表及其从一个模式到另一个模式的序列的方法有效。
更新:问题出在应用程序配置中。我们的数据库使用与两个 pg 服务器的 pgpool 连接。连接到池会产生错误。直接连接到 main/master pg 服务器后它就消失了。