PostgreSQL:重复的键值违反了 UPDATE 命令的唯一约束

标签 postgresql postgresql-9.3

在执行 UPDATE 查询时,我们收到以下错误消息:

ERROR:  duplicate key value violates unique constraint "tableA_pkey"
DETAIL:  Key (id)=(47470) already exists.

但是,我们的 UPDATE 查询不会影响主键。这是一个简化版本:

UPDATE tableA AS a
SET
    items = (
        SELECT array_to_string(
            array(
                SELECT b.value
                FROM tableB b
                WHERE b.a_id = b.id
                GROUP BY b.name
            ),
            ','
        )
    )
WHERE
    a.end_at BETWEEN now() AND  now() - interval '1 day';

我们确保主键序列已经同步:

\d tableA_id_seq

产生:

    Column     |  Type   |          Value           
---------------+---------+--------------------------
 sequence_name | name    | tableA_id_seq
 last_value    | bigint  | 50364
 start_value   | bigint  | 1
 increment_by  | bigint  | 1
 max_value     | bigint  | 9223372036854775807
 min_value     | bigint  | 1
 cache_value   | bigint  | 1
 log_cnt       | bigint  | 0
 is_cycled     | boolean | f
 is_called     | boolean | t

寻找最大表索引:

select max(id) from tableA;

我们得到了一个较低的值:

  max  
-------
 50363
(1 row)

您知道为什么会出现这种行为吗?如果我们排除有问题的 ID,它就会起作用。

还有一个比较奇怪的地方就是将之前的UPDATE替换成:

UPDATE tableA AS a
SET
    items = (
        SELECT array_to_string(
            array(
                SELECT b.value
                FROM tableB b
                WHERE b.a_id = b.id
                GROUP BY b.name
            ),
            ','
        )
    )
WHERE a.id = 47470;

效果很好。我们是否遗漏了什么?

编辑: 触发器

我在这个表上没有用户定义的触发器:

SELECT t.tgname, c.relname
FROM pg_trigger t
JOIN pg_class c ON t.tgrelid = c.oid
WHERE
    c.relname = 'tableA'
    AND
    t.tgisinternal = false
;

不返回任何行。

注意:我使用的是 psql (PostgreSQL) 9.3.4 版本。

最佳答案

不太确定是什么原因。但是,删除与现有 ID (?) 相对应的两条(非重要)记录解决了这个问题。

关于PostgreSQL:重复的键值违反了 UPDATE 命令的唯一约束,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24447930/

相关文章:

r - 调度属于 R 包的函数

sql - PostgreSQL:使用 psql 命令行实用程序时 Windows 上的编码问题

java - 如何将CellStyle对象存储到数据库中?

postgresql - 在 cron 中备份 postgres 数据库的问题

postgresql - 使用函数执行具有不同数据类型的多个选择语句

ruby-on-rails - Rails、Count 和 Group

sql - PGAdmin 从哪里获取估计的行数?

postgresql - postgres COPY FROM 的权限被拒绝,但文件夹具有读取权限

sql - 为每组数据聚合一组结果

postgresql - LANGUAGE sql 中函数的 RAISE EXCEPTION 语句的等效或替代方法?