Jest to możliwe, ale prawdopodobnie lepiej będzie ustawić domyślne ograniczenie dla kolumny. Podczas tworzenia tabeli, która będzie wyglądać następująco:
create table mytable as (
C1 thetype not null default X
);
mówi to, że jeśli dodać wiersz do tabeli i nie określają wartości dla C1 to X będzie używany zamiast. Wartość "null" nie jest konieczna, ale zapobiega pobieraniu aktualizacji od kolumny, zakładając, że tego właśnie chcesz.
EDYCJA: Działa tylko dla stałej X, z twoich komentarzy wynika, że są dwa możliwe rozwiązania.
Korzystanie wyzwalacz będzie wyglądać mniej więcej tak:
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();
new
zmienna w funkcji wyzwalania jest wyjątkowy, reprezentujący rząd jest włożona. Określenie wyzwalacza jako wyzwalacza before insert
oznacza, że można zmodyfikować wiersz, zanim zostanie zapisany w tabeli.
Drugim rozwiązaniem byłoby użyć kolumna obliczana który Postgres definiujący w niezwykły sposób:
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;
Stwarza funkcję, która pobiera wiersz tabeli i zwraca wartość, można wywołać go za pomocą . notacja choć, dzięki czemu można zrobić:
select
*,
t.C1
from
mytable t;
Deklaracja funkcją jest niezmienna jest opcjonalne, ale jest to potrzebne, jeśli chcesz indeksować „kolumny”. Byłbyś w stanie indeksować kolumna ta tak:
create index on mytable (C1(mytable));
Pl zwrócić uwagę, że ta wartość X musi zostać pobrana z innego podkwerendy. – user1408470