Сделайте следующую схему для моей базы данных:
create sequence data_sequence;
create table data_table
{
id integer primary key;
field varchar(100);
};
create view data_view as
select id, field from data_table;
create function data_insert(_new data_view) returns data_view as
$$declare
_id integer;
_result data_view%rowtype;
begin
_id := nextval('data_sequence');
insert into data_table(id, field) values(_id, _new.field);
select * into _result from data_view where id = _id;
return _result;
end;
$$
language plpgsql;
create rule insert as on insert to data_view do instead
select data_insert(new);
Затем введите psql:
insert into data_view(field) values('abc');
Хотелось бы увидеть что-то вроде:
id | field
----+---------
1 | abc
Вместо этого см .:
data_insert
-------------
(1, "abc")
Можно ли это как-то исправить?
Спасибо за любые идеи.
Конечная идея - использовать это в других функциях, чтобы я мог получить идентификатор только что вставленной записи, не выбирая ее с нуля. Что-то вроде:
insert into data_view(field) values('abc') returning id into my_variable
было бы неплохо, но не работает с ошибкой:
ERROR: cannot perform INSERT RETURNING on relation "data_view"
HINT: You need an unconditional ON INSERT DO INSTEAD rule with a RETURNING clause.
Я на самом деле не понимаю, что подсказка. Я использую PostgreSQL 8.4.