web-dev-qa-db-ja.com

「ON」またはその近くでのpostgres構文エラー

私はこのテーブルを作成しました:

CREATE TABLE IF NOT EXISTS config_activity_log
(
  id                      serial primary key,
  activity_name           varchar(100) NOT NULL,
  last_config_version     varchar(50) NOT NULL,
  activity_status         varchar(100) NOT NULL DEFAULT 'Awaiting for cofman',
  cofman_last_update      bigint NOT NULL DEFAULT -1,
  is_error                boolean DEFAULT FALSE,
  activity_timestamp      timestamp DEFAULT current_timestamp
);

私はこのpostgresスクリプトを実行しようとします:

INSERT INTO config_activity_log
    (activity_name, last_config_version, activity_status)
VALUES
    ('test awating deployment','5837-2016-08-24_09-12-22', 'Awaiting for deployment')
ON CONFLICT (activity_name)
DO UPDATE SET
    activity_status = EXCLUDED.activity_status

なぜこの構文エラーが発生するのですか?

psql:upsert_test_log.sql:7: ERROR:  syntax error at or near "ON"
LINE 5: ON CONFLICT (activity_name)
6
Elad Benda2

サポートされているバージョン

上記の@klinのコメントによると、ON CONFLICTPostgreSQL 9.5以降でのみサポートされます。

以前のバージョンを使用している場合は、この回答にいくつかの優れた情報があります: https://stackoverflow.com/a/17267423/361842

一意性制約

activity_nameに一意のインデックスを追加します。現在、その列に制約はないため、その列で競合が発生する可能性はありません。

CREATE UNIQUE INDEX UK_config_activity_log__activity_name 
ON config_activity_log (activity_name);

ただし、その列を一意にしたくない場合は、どのような競合を想定していますか/ on conflictアクションで解決したい問題は何ですか?

https://www.postgresql.org/docs/9.5/static/sql-insert.html#SQL-ON-CONFLICT のconflict_targetを参照してください。


別の構文は、createステートメントを変更して、そこに一意の条件を含めることです。例えば.

CREATE TABLE IF NOT EXISTS config_activity_log
(
  id                      serial primary key,
  activity_name           varchar(100) NOT NULL UNIQUE,
  last_config_version     varchar(50) NOT NULL,
  activity_status         varchar(100) NOT NULL DEFAULT 'Awaiting for cofman',
  cofman_last_update      bigint NOT NULL DEFAULT -1,
  is_error                boolean DEFAULT FALSE,
  activity_timestamp      timestamp DEFAULT current_timestamp
);
7
JohnLBevan

エラーコードによると、お使いのバージョンはON CONFLICTをサポートしていません。
PostreSQL 9.6では、エラーメッセージは-

[Code: 0, SQL State: 42P10]  ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification