私はPostgreSQLのINSERT INTO .. ON CONFLICT (..) DO UPDATE ..
構文を見ていましたが、それを使用して複数の一意制約チェックを実行することはできません。つまり、複合一意インデックスを列名で参照するかON CONFLICT (Name, Symbol)
(一意のインデックスがこれらの2つの列に対して定義されている場合)、または主キーを使用します。列に2つの個別の一意のインデックスを定義する場合、チェックできるのは1つだけです。
CREATE TABLE student
(Id int primary key, Name varchar(50), Symbol varchar(50),
CONSTRAINT col1_unique UNIQUE (Name),
CONSTRAINT col2_unique UNIQUE (Symbol)
);
INSERT INTO student
(Id, Name, Symbol)
VALUES
(1, 'John', 'J'),
(2, 'David', 'D'),
(3, 'Will', 'W');
INSERT INTO student
(Id, Name, Symbol)
VALUES
(4, 'Jeremy', 'J')
on conflict(Name) DO UPDATE
set Name = 'Jeremy';
J
重複していると言ってエラーをスローする可能性があります。ただし、この例はシンボルが別のテーブルにあり、1対多の関係で生徒のテーブルに接続されている必要があるため、単に悪いデザインです。ですから、PostgreSQL on conflict
はこのように設計されたのではないかと思います。一意のインデックスが1つしかない方法で、常にテーブルを再構築できるからです。それは本当ですか、それとも別の理由がありますか?