Es ist möglich, aber es ist wahrscheinlich besser, wenn Sie stattdessen eine Standardeinschränkung für die Spalte festlegen. Wenn die Tabelle erstellen, würde wie folgt aussehen:
create table mytable as (
C1 thetype not null default X
);
, dass dies sagt, wenn Sie eine Zeile in der Tabelle hinzufügen, und geben Sie nicht den Wert für C1 dann wird X stattdessen verwendet werden. Das not null ist nicht notwendig, verhindert aber, dass Updates diese Spalte annullieren, vorausgesetzt, dass dies das ist, was Sie wollen.
EDIT: Dies funktioniert nur für konstante X, aus Ihren Kommentaren scheint es gibt zwei mögliche Lösungen.
Auslöser verwendet in etwa 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 new
Variable in einer Triggerfunktion ist speziell, als Vertreter der Reihe eingeführt wird. Wenn Sie den Trigger als before insert
-Trigger angeben, können Sie die Zeile ändern, 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;
eine Funktion Dies erzeugt, die eine Zeile der Tabelle nimmt und einen Wert zurückgibt, können Sie es nennen mit . Notation aber, was bedeutet, Sie tun können:
select
*,
t.C1
from
mytable t;
Die Deklaration der Funktion unveränderlich zu sein, ist optional, aber es benötigt wird, wenn Sie indizieren wollen die „Spalte“. Sie würden diese Spalte wie folgt Index der Lage sein:
create index on mytable (C1(mytable));
Bitte beachten Sie, dass dieser Wert X von einer anderen Unterabfrage abgerufen werden muss. – user1408470