PostgreSQL:重复键值违反了UPDATE命令的唯一约束
发布时间:2020-12-13 16:17:50 所属栏目:百科 来源:网络整理
导读:在执行UPDATE查询时,我们收到以下错误消息: ERROR: duplicate key value violates unique constraint "tableA_pkey"DETAIL: Key (id)=(47470) already exists. 但是,我们的UPDATE查询不会影响主键.这是一个简化版本: UPDATE tableA AS aSET items = ( SELE
在执行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(?)对应的两个(非重要)记录可以解决问题.
(编辑:李大同) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |