[英]How to copy, change, and insert records in Postgres
在 PostgreSQL 数据库表中,我需要复制前一个月的记录块,更改某些列中的值,并将更新的记录附加到表中。 详情包括:
id
配置了nextval
以自动创建唯一键值group_tag
有'200814'
group_tag
'200911'
group_tag
SELECT
所示到目前为止我的脚本:
INSERT INTO hist.group_control(
id,
group_tag,
process_sequence,
state,
cbsa_code,
window_starts_on,
preceding_group,
preceding_origin,
preceding_window_starts_on
)
SELECT id,
'200911',
1,
state,
cbsa_code,
'2020-09-11',
'200814',
preceding_origin,
'2020-08-14'
FROM hist.group_control WHERE group_tag='200814';
这会产生一个错误:
SQL Error [23505]: ERROR: duplicate key value violates unique constraint "group_control_pkey"
Detail: Key (id)=(12250) already exists.
存在键值最多为13008
记录。 我本来希望nextval
确定这一点并从13009
开始id
值。 我试图简单地在语句中不包含id
认为nextval
函数会自动运行,但这也出错了。 由于各自的错误,以下变体没有起作用:
alter sequence group_control_id_seq restart with 13009;
SQL Error [42501]: ERROR: must be owner of relation group_control_id_seq
SELECT setval('group_control_id_seq', 13009, true);
SQL Error [42501]: ERROR: permission denied for sequence group_control_id_seq
任何人都知道如何编写主语句以不生成重复键,或者如何告诉nextval
从13009
的值开始
它显示为您的串行、大串行或默认生成的。 这些中的任何一个仅在插入语句中未指定时分配 id 列。 如果指定 id 列 Postgres 将不会分配密钥 PK。 由于您选择了 id,Postgres 尝试使用您指定的内容。 解决方案从插入语句中删除 id。
INSERT INTO hist.group_control(
group_tag,
process_sequence,
state,
cbsa_code,
window_starts_on,
preceding_group,
preceding_origin,
preceding_window_starts_on
)
SELECT '200911',
1,
state,
cbsa_code,
'2020-09-11',
'200814',
preceding_origin,
'2020-08-14'
FROM hist.group_control WHERE group_tag='200814';
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.