Stavo osservando la INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
sintassi di PostgreSQL e ho realizzato che non è possibile eseguire più controlli univoci dei vincoli con esso. Voglio dire, o fai riferimento a un indice univoco composito dai nomi delle colonne ON CONFLICT (Name, Symbol)
(se l'indice univoco è definito per queste due colonne) o usi la chiave primaria. Se si definiscono due indici univoci separati per le colonne, è possibile verificarne solo uno.
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';
Potrebbe generare un errore, dicendo che J
è un duplicato. Tuttavia, questo esempio è semplicemente un cattivo design, perché il simbolo dovrebbe essere in un'altra tabella ed essere collegato alla tabella degli studenti tramite una relazione uno-a-molti. È per questo che mi chiedo, forse PostgreSQL è on conflict
stato progettato in questo modo, perché puoi SEMPRE ristrutturare le tabelle in un modo, dove esiste un solo indice univoco. È vero o c'è un'altra ragione?
Esempio di violino: http://www.sqlfiddle.com/#!17/9c0ce