it-swarm.com.de

Postgresql Trigger einfügen, um den Wert festzulegen

Angenommen, in Postgresql habe ich eine Tabelle T und eine ihrer Spalten ist C1.

Ich möchte eine Funktion auslösen, wenn ein neuer Datensatz zur Tabelle T hinzugefügt wird. Die Funktion sollte den Wert der Spalte C1 Im neuen Datensatz prüfen und, wenn sie leer ist, ihren Wert auf 'X' Setzen.

Ist das möglich?

49
user1408470

Sie haben Recht, dass Sie einen Trigger benötigen, da das Festlegen eines Standardwerts für die Spalte für Sie nicht funktioniert - Standardwerte funktionieren nur für null Werte und helfen Ihnen nicht, leere Werte zu verhindern.

In postgres gibt es ein paar Schritte zum Erstellen eines Triggers:

Schritt 1: Erstellen Sie eine Funktion, die den Typ trigger zurückgibt:

CREATE FUNCTION my_trigger_function()
RETURNS trigger AS '
BEGIN
  IF NEW.C1 IS NULL OR NEW.C1 = '''' THEN
    NEW.C1 := ''X'';
  END IF;
  RETURN NEW;
END' LANGUAGE 'plpgsql'

Schritt 2: Erstellen Sie einen Trigger, der vor dem Einfügen auslöst, mit dem Sie Werte ändern können, ohne dass sie eingefügt werden, und der die obige Funktion aufruft:

CREATE TRIGGER my_trigger
BEFORE INSERT ON T
FOR EACH ROW
EXECUTE PROCEDURE my_trigger_function()

Und du bist fertig.

Siehe der obige Code, der auf SQLFIddle ausgeführt wird Demonstrieren, dass es richtig funktioniert!


Sie erwähnen in einem Kommentar, dass der Wert 'X' wird aus einer Unterabfrage abgerufen. Wenn ja, ändern Sie die betreffende Zeile so etwas wie:

NEW.C1 := (select some_column from some_table where some_condition);
77
Bohemian

Es ist möglich, aber es ist wahrscheinlich besser, dass Sie stattdessen eine Standardeinschränkung für die Spalte festlegen. Beim Erstellen der Tabelle würde das so aussehen:

create table mytable as (
    C1 thetype not null default X
);

Wenn Sie der Tabelle eine Zeile hinzufügen und den Wert für C1 nicht angeben, wird stattdessen X verwendet. Der Wert not null ist nicht erforderlich, verhindert jedoch, dass Aktualisierungen diese Spalte auf null setzen, sofern Sie dies wünschen.

BEARBEITEN: Dies funktioniert nur für Konstante X. Aus Ihren Kommentaren geht hervor, dass es zwei mögliche Lösungen gibt.

Die Verwendung eines Triggers würde ungefähr so ​​aussehen:

create function update_row_trigger() returns trigger as $$
begin
    if new.C1 is NULL then
        new.C1 := X;
    end if;
    return new;
end
$$ language plpgsql;

create trigger mytrigger before insert on mytable for each row execute procedure update_row_trigger();

Die Variable new in einer Triggerfunktion ist speziell und repräsentiert die einzufügende Zeile. Angabe des Triggers als before insert Trigger bedeutet, dass Sie die Zeile ändern können, bevor sie in die Tabelle geschrieben wird.

Die zweite Lösung wäre, eine berechnete Spalte zu verwenden, die Postgres auf ungewöhnliche Weise definiert:

create or replace function C1(row mytable) returns columntype immutable as $$
begin
    return X; -- where X is an expression using values from `row`
end
$$ language plpgsql;

Dadurch wird eine Funktion erstellt, die eine Zeile Ihrer Tabelle ausfüllt und einen Wert zurückgibt, den Sie mit aufrufen können. Notation, was bedeutet, dass Sie Folgendes tun können:

select
    *,
    t.C1
from
    mytable t;

Die Deklaration der unveränderlichen Funktion ist optional, wird jedoch benötigt, wenn Sie die "Spalte" indizieren möchten. Sie könnten diese Spalte folgendermaßen indizieren:

create index on mytable (C1(mytable));
9
Steve