繁体   English   中英

如何在 Postgres 中复制、更改和插入记录

[英]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

任何人都知道如何编写主语句以不生成重复键,或者如何告诉nextval13009的值开始

它显示为您的串行、大串行或默认生成的。 这些中的任何一个仅在插入语句中未指定时分配 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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM