2017-01-06 2 views
1

Ich habe eine Postgres 9.6 Tabelle mit bestimmten Spalten, die eindeutig sein müssen. Wenn ich versuche, eine doppelte Zeile einzufügen, möchte ich, dass Postgres einfach die Einfügung ignoriert und fortfährt, anstatt fehlzuschlagen oder abzubrechen. Wenn die Einfügung in eine Transaktion eingeschlossen ist, sollte sie die Transaktion nicht abbrechen oder andere Aktualisierungen in der Transaktion beeinflussen.Kann Postgres Spaltenkonditionskonflikte ignorieren?

Ich nehme an, es gibt eine Möglichkeit, die Tabelle wie oben beschrieben zu erstellen, aber ich habe es noch nicht herausgefunden.

Bonuspunkte, wenn Sie mir zeigen können, wie es in Rails geht.

Antwort

4

Dies ist möglich mit der ON CONFLICT clause for INSERT:

Die optionale ON CONFLICT-Klausel gibt eine alternative Aktion eine eindeutige Verletzung oder Ausschluss Einschränkungsverletzung Fehler erhöhen. Für jede einzelne Zeile, die für die Einfügung vorgeschlagen wird, wird entweder die Einfügung fortgesetzt, oder, falls eine durch angegebene Konfliktbedingung oder der Index conflict_target verletzt wird, wird die alternative conflict_action verwendet. ON CONFLICT Do Nothing vermeidet einfach das Einfügen einer Zeile als alternative Aktion.

Dies ist eine relativ neue Funktion und nur seit Postgres 9.5 verfügbar, aber das ist kein Problem für Sie.

Dies ist nichts, was Sie bei der Tabellenerstellung festlegen, Sie müssen jede Einfügung ändern. Ich weiß nicht, wie das mit Rails funktioniert, aber ich denke, Sie müssen mindestens einen Teil der Abfragen manuell schreiben, um dies zu tun.

Diese Funktion wird auch oft als UPSERT bezeichnet. Dies ist wahrscheinlich ein besserer Begriff für die Suche, wenn Sie nach einer integrierten Methode in Rails suchen.

Verwandte Themen