为我的数据库做如下方案:
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")
是否有可能以某种方式解决这个问题?
感谢您的任何想法。
最终的想法是在其他函数中使用它,这样我就可以获得刚刚插入的记录的 ID,而无需从头开始选择它。像这样的东西:
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。
最佳答案
你想做的事情已经内置到 postgres 中了。它允许您在 INSERT 语句中包含 RETURNING 子句。
CREATE TABLE data_table (
id SERIAL,
field VARCHAR(100),
CONSTRAINT data_table_pkey PRIMARY KEY (id)
);
INSERT INTO data_table (field) VALUES ('testing') RETURNING id, field;
如果您觉得必须使用 View ,请检查 this thread在继续之前在 postgres 邮件列表上。
关于sql - 如何从由 INSERT/UPDATE 规则(触发器)执行的函数返回记录?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2615780/