web-dev-qa-db-ja.com

PostgreSQL:重複するキー値がUPDATEコマンドの一意の制約に違反しています

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バージョンを使用しています。

8

原因がよくわかりません。ただし、既存のID(?)に対応する2つの(重要ではない)レコードを削除すると、問題が解決しました。

2