首页 > 解决方案 > 如何在 Postgres 中复制、更改和插入记录

问题描述

在 PostgreSQL 数据库表中,我需要复制上个月的记录块,更改某些列中的值,并将更新的记录附加到表中。详细信息包括:

到目前为止我的脚本:

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

标签: sqlpostgresqlunique-keydbeavernextval

解决方案


它显示您的序列号、大序列号或默认生成。其中任何一个仅在插入语句中未指定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'; 

推荐阅读