Saya melihat INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
sintaks PostgreSQL dan menyadari, Anda tidak dapat melakukan beberapa pemeriksaan kendala unik dengannya. Maksud saya, Anda merujuk pada indeks unik gabungan dengan nama kolom ON CONFLICT (Name, Symbol)
(jika indeks unik ditentukan untuk dua kolom ini), atau Anda menggunakan kunci utama. Jika Anda menentukan dua indeks unik terpisah untuk kolom, Anda hanya dapat memeriksa satu.
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';
Bisa melempar kesalahan, mengatakan J
itu duplikat. Namun, contoh ini hanyalah desain yang buruk, karena Simbol harus di tabel lain dan terhubung ke tabel siswa melalui hubungan satu ke banyak. Itulah sebabnya saya bertanya-tanya, mungkin PostgreSQL on conflict
dirancang dengan cara ini, karena Anda SELALU dapat menyusun ulang tabel dengan cara, di mana hanya ada satu indeks unik. Apakah benar atau ada alasan lain?
Contoh biola: http://www.sqlfiddle.com/#!17/9c0ce