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
la source
Réponses:
Il y a toujours la sixième forme normale ou clé de domaine. Ici, chaque colonne non clé devient sa propre table. Ainsi, la table 3NF T (Clé, Col1, Col2, ..) devient T1 (Clé, Col1), T2 (Clé, Col2) etc. Ces nouvelles tables qui nécessitent l'unicité peuvent la faire déclarer.
Je pense cependant qu'avoir plusieurs contraintes uniques sur une table est parfaitement OK. Prenons par exemple un tableau des pays. Cela aurait, disons, une ID, le nom, le code ISO, la capitale et quelques autres. Chacun de ces quatre premiers sera unique. De plus, si nous voulons que notre système repose sur chacun étant unique, je pense que nous devons définir des contraintes uniques pour chacun. Cela renforce les vérités sur les données sur lesquelles tous les consommateurs peuvent s'appuyer.
la source
MERGE
instruction). Le pgON CONFLICT DO UPDATE
n'a été ajouté qu'en 9.5 et est beaucoup plus limité.ON CONFLICT DO NOTHING
sans mentionner de contraintes uniques et il les considérera toutes (et ne fera rien). Lorsque vous voulez le faireON CONFLICT DO UPDATE
, vous devez déclarer une colonne ou une contrainte et une seule. La restriction pourrait être levée dans les versions futures.ON CONFLICT ... DO UPDATE
et malheureusement cette réponse n'aborde pas ce point.