Ich habe mir die INSERT INTO .. ON CONFLICT (..) DO UPDATE ..
Syntax von PostgreSQL angesehen und festgestellt, dass Sie damit nicht mehrere eindeutige Einschränkungsprüfungen durchführen können. Ich meine, Sie verweisen entweder mit den Spaltennamen auf einen zusammengesetzten eindeutigen Index ON CONFLICT (Name, Symbol)
(wenn der eindeutige Index für diese beiden Spalten definiert ist), oder Sie verwenden den Primärschlüssel. Wenn Sie zwei separate eindeutige Indizes für die Spalten definieren, können Sie nur nach einem suchen.
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';
Könnte einen Fehler auslösen und sagen, dass J
es sich um ein Duplikat handelt. Dieses Beispiel ist jedoch einfach ein schlechtes Design, da sich das Symbol in einer anderen Tabelle befinden und über eine Eins-zu-Viele-Beziehung mit der Schülertabelle verbunden sein sollte. Aus diesem Grund frage ich mich, ob PostgreSQL möglicherweise so on conflict
konzipiert wurde, weil Sie die Tabellen IMMER so umstrukturieren können, dass es nur einen einzigen eindeutigen Index gibt. Ist es wahr oder gibt es einen anderen Grund?
Beispiel Geige: http://www.sqlfiddle.com/#!17/9c0ce