Frage

Ich habe einen PostgreSQL-Trigger vor dem Einfügen beim Erstellen, der Einfügungen grundsätzlich in Untertabellen umleitet.Sobald ich den Datensatz eingefügt habe, möchte ich die Anforderung abbrechen, um doppelte Daten zu vermeiden (indem ich sie nicht in die übergeordnete Tabelle einfüge). Daher verwende ich return NULL im Trigger.Das Problem ist, dass ich den Datensatz zurückgeben muss, damit ich die ID erhalten kann.Wenn ich NULL zurückgebe, erhalte ich NULL.

Das obige Problem wird unter dem folgenden Link erläutert:PostgreSQL-Trigger gibt nichts zurück

Eine der Antworten besagt, dass in die übergeordnete Tabelle eingefügt werden soll (indem nicht null zurückgegeben, sondern neu zurückgegeben wird) und der Trigger nach dem Einfügen verwendet wird, um ihn aus der übergeordneten Tabelle zu löschen.Aber ich betrachte 1000 Schreibvorgänge pro Sekunde und dies kann aufgrund der ein ernstes Leistungsproblem darstellen deletes.is gibt es eine andere Möglichkeit, dies zu tun?

Um genau zu sein, gibt es eine Möglichkeit, die ID einer eingefügten Zeile zurückzugeben, ohne sie in die übergeordnete Tabelle einzufügen und später zu löschen.

War es hilfreich?

Lösung

Ich schrieb die Antwort, auf die Sie sich beziehen.Wie ich dort drüben schon angedeutet habe:

Sie könnten auch eine verwenden RULE ... INSTEAD .. dazu.

RULE

Geschäftsregeln kann schwierig sein.Ich würde lieber Trigger verwenden, wo es möglich ist. Achten Sie darauf, ein bisschen zu lesen, bevor Sie dies versuchen:

CREATE OR REPLACE RULE tbl_ins AS
ON INSERT TO tbl
DO INSTEAD
INSERT INTO tbl2 (col1, col2, ...)  -- just do mention columns where ...
VALUES (NEW.col1, NEW.col2, ...)    -- ... you want to insert column defaults
RETURNING tbl2.*

Das würde Werte zurückgeben von tbl2 unter Vermeidung von Phantomreihen. Jedoch, pro Dokumentation auf CREATE RULE:

In einer Regel für INSERT, UPDATE, oder DELETE in einer Ansicht können Sie eine hinzufügen RETURNING klausel, die die Spalten der Ansicht ausgibt.Diese Klausel wird sein wird verwendet, um die Ausgaben zu berechnen, wenn die Regel von einem ausgelöst wird INSERT RETURNING, UPDATE RETURNING, oder DELETE RETURNING befehl jeweils.Wenn die Regel durch einen Befehl ohne ausgelöst wird RETURNING, Regel RETURNING klausel wird ignoriert. Die aktuelle Implementierung ermöglicht nur bedingungslos INSTEAD regeln enthalten RETURNING;

Kühne Betonung von mir.
Da du erwähnst sub-tables, Ich nehme an, Sie bräuchten Bedingungen, um die Einsätze zu verteilen...

currval() / lastval()

Wenn Sie mit einem Abzug arbeiten FOR EACH ROW Sie können einfach geeignete Werte aus Sequenzen abrufen mit currval() / lastval().Der schwierige Teil besteht darin, diese Werte von einer Triggerfunktion zurückzugeben.Ich kann nur daran denken, an einen temporären Tisch zu schreiben.Braucht etwas Nachdenken, wann man es schafft und wann man es fallen lässt...

Ich würde wahrscheinlich den gesamten Ansatz überdenken und leiten Sie die Daten auf mehrere um INSERT anweisungen zu tatsächlichen Zieltabellen...

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top