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
quelle
Antworten:
Es gibt immer die sechste oder Domänenschlüssel-Normalform. Hier wird jede Nicht-Schlüsselspalte zu einer eigenen Tabelle. Die 3NF-Tabelle T (Schlüssel, Spalte 1, Spalte 2, ..) wird also zu T1 (Schlüssel, Spalte 1), T2 (Schlüssel, Spalte 2) usw. Für die neuen Tabellen, die Eindeutigkeit erfordern, kann sie deklariert werden.
Ich denke jedoch, dass es vollkommen in Ordnung ist, mehrere eindeutige Einschränkungen für eine Tabelle zu haben. Nehmen Sie zum Beispiel eine Tabelle mit Ländern. Dies hätte beispielsweise eine ID, den Namen, den ISO-Code, die Hauptstadt und einige andere. Jeder dieser ersten vier wird einzigartig sein. Wenn wir möchten, dass unser System darauf beruht, dass jedes System einzigartig ist, sollten wir meines Erachtens für jedes System eindeutige Einschränkungen definieren. Dies erzwingt Wahrheiten über die Daten, auf die sich alle Verbraucher verlassen können.
quelle
MERGE
Anweisung). Die SeiteON CONFLICT DO UPDATE
wurde erst in 9.5 hinzugefügt und ist viel eingeschränkter.ON CONFLICT DO NOTHING
verzichten, eindeutige Einschränkungen zu erwähnen, und alle werden berücksichtigt (und nichts unternommen). Wenn Sie dies tun möchten, müssenON CONFLICT DO UPDATE
Sie eine Spalte oder eine Einschränkung deklarieren und nur eine. Die Einschränkung wird möglicherweise in zukünftigen Versionen aufgehoben.ON CONFLICT ... DO UPDATE
und leider spricht diese Antwort diesen Punkt nicht an.