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を除外すると、機能します。
もう1つの奇妙な点は、以前の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(?)に対応する2つの(重要ではない)レコードを削除すると、問題が解決しました。