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
sumber
Jawaban:
Selalu ada Keenam, atau Kunci Domain, Bentuk Normal. Di sini setiap kolom non-kunci menjadi tabelnya sendiri. Jadi 3NF tabel T (Key, Col1, Col2, ..) menjadi T1 (Key, Col1), T2 (Key, Col2) dll. Tabel-tabel baru yang membutuhkan keunikan dapat dideklarasikan.
Saya pikir memiliki beberapa kendala unik di atas meja adalah OK, namun. Ambil contoh tabel negara. Ini akan memiliki, katakanlah, ID, nama, kode ISO, ibu kota, dan beberapa lainnya. Masing-masing dari empat yang pertama akan menjadi unik. Selain itu, jika kita ingin sistem kita bergantung pada masing-masing menjadi unik, saya percaya kita harus mendefinisikan batasan unik pada masing-masing. Ini menegakkan kebenaran tentang data yang dapat diandalkan semua konsumen.
sumber
MERGE
pernyataan). PgON CONFLICT DO UPDATE
hanya ditambahkan pada 9,5 dan jauh lebih terbatas.ON CONFLICT DO NOTHING
tanpa menyebutkan kendala unik dan itu akan mempertimbangkan semuanya (dan tidak melakukan apa-apa). Ketika Anda ingin melakukannyaON CONFLICT DO UPDATE
, Anda harus mendeklarasikan kolom atau batasan dan hanya satu. Pembatasan mungkin dicabut di versi mendatang.ON CONFLICT ... DO UPDATE
dan sayangnya jawaban ini tidak membahas titik itu.