sql - 如何在 Postgres 中复制、更改和插入记录
问题描述
在 PostgreSQL 数据库表中,我需要复制上个月的记录块,更改某些列中的值,并将更新的记录附加到表中。详细信息包括:
- 键
id
配置nextval
为自动创建唯一键值 - 目标记录
'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
确定这一点并将id
值从13009
. 我试图简单地不包括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';
推荐阅读
- swift - 如何从 MTKView 无缝切换到 UIView 显示
- angular - angular typescript observable 中的 HTTP 响应加载非常慢
- json - 使用 jq 将 JSON 从 AWS SSM 转换为环境变量
- networking - 公共IP范围可以用作私有IP吗?
- python - 运行 manage.py migrate 时出错
- java - NextActivity onCreate() 被跳过
- vba - VBA 查看 A 列中的单元格名称,根据该名称打开文件,并仅复制 C 列中的标题:
- python - 在 Python 中管理(即正确终止)MongoDB 守护程序的最可接受的方法是什么?
- windows - PS脚本复制新文件
- javascript - 根据网页上的用户输入对列表进行排序