È possibile ma è probabile che sia preferibile impostare un vincolo predefinito sulla colonna. Quando si crea la tabella che sarà simile:
create table mytable as (
C1 thetype not null default X
);
Questo dice che se si aggiunge una riga al tavolo e non si specifica il valore per C1 allora X sarà utilizzato al posto. Il non nullo non è necessario, ma impedisce agli aggiornamenti di annullare quella colonna assumendo che sia ciò che si desidera.
MODIFICA: funziona solo per X costante, dai tuoi commenti sembra che ci siano due soluzioni possibili.
Utilizzando un trigger sarebbe simile a questa:
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();
Il new
variabile in una funzione di trigger è speciale, che rappresenta la riga viene inserita. Specificare il trigger come trigger before insert
significa che è possibile modificare la riga prima che venga scritta sulla tabella.
La seconda soluzione sarebbe quella di utilizzare una colonna calcolata che Postgres definisce in un modo insolito:
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;
questo modo si crea una funzione che prende una riga della tabella e restituisce un valore, si può chiamare usando . notazione, però, il che significa che si può fare:
select
*,
t.C1
from
mytable t;
La dichiarazione della funzione di essere immutabili è facoltativo, ma è necessario se si vuole indicizzare la "colonna". Si sarebbe in grado di indicizzare questa colonna come questo:
create index on mytable (C1(mytable));
Si noti che questo valore X deve essere recuperato da un'altra sottoquery. – user1408470