Это возможно, но вам, вероятно, будет лучше вместо этого установить ограничение по умолчанию для столбца. При создании таблицы она будет выглядеть так:
create table mytable as (
C1 thetype not null default X
);
Это говорит о том, что если вы добавите строку в таблицу и не укажете значение для C1, вместо этого будет использоваться X. Нулевое значение не является обязательным, но не позволяет обновлениям обнулять этот столбец, если вы этого хотите.
РЕДАКТИРОВАТЬ: это работает только для постоянного X, из ваших комментариев кажется, что есть два возможных решения.
Использование триггера будет выглядеть примерно так:
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
в функции триггера является специальной, представляя вставляемую строку. Указание триггера как триггера before insert
означает, что вы можете изменить строку до того, как она будет записана в таблицу.
Второе решение - использовать вычисляемый столбец, который Postgres определяет необычным образом:
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;
Это создает функцию, которая берет строку вашей таблицы и возвращает значение, которое вы можете вызвать с помощью. обозначения, что означает, что вы можете:
select
*,
t.C1
from
mytable t;
Объявление неизменяемой функции необязательно, но оно необходимо, если вы хотите проиндексировать «столбец». Вы можете проиндексировать этот столбец следующим образом:
create index on mytable (C1(mytable));
person
Steve
schedule
19.04.2013