Je regardais la INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
syntaxe de PostgreSQL et j'ai réalisé que vous ne pouvez pas faire plusieurs vérifications de contraintes uniques avec elle. Je veux dire, soit vous faites référence à un index unique composite par les noms de colonne ON CONFLICT (Name, Symbol)
(si l'index unique est défini pour ces deux colonnes), soit vous utilisez la clé primaire. Si vous définissez deux index uniques distincts pour les colonnes, vous ne pouvez en rechercher qu'un.
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';
Pourrait générer une erreur en disant qu'il J
s'agit d'un doublon. Cependant, cet exemple est tout simplement une mauvaise conception, car le symbole doit être dans une autre table et être connecté à la table des étudiants via une relation un à plusieurs. C'est pourquoi je me demande, peut-être que PostgreSQL a on conflict
été conçu de cette façon, car vous pouvez TOUJOURS restructurer les tables d'une manière, où il n'y a qu'un seul index unique. Est-ce vrai ou il y a une autre raison?
Exemple de violon: http://www.sqlfiddle.com/#!17/9c0ce