这种情况可能吗?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
比如使用返回值作为插入第二张表的一行的值,并且这一行与第一张表有关联?
这种情况可能吗?
INSERT INTO Table2 (val)
VALUES ((INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id));
比如使用返回值作为插入第二张表的一行的值,并且这一行与第一张表有关联?
您可以从Postgres 9.1开始这样做:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val)
SELECT id
FROM rows
如果你仅对ID感兴趣,可以使用触发器来实现:
create function t1_ins_into_t2()
returns trigger
as $$
begin
insert into table2 (val) values (new.id);
return new;
end;
$$ language plpgsql;
create trigger t1_ins_into_t2
after insert on table1
for each row
execute procedure t1_ins_into_t2();
在这种情况下,最佳实践是使用RETURNING … INTO
。
INSERT INTO teams VALUES (...) RETURNING id INTO last_id;
请注意,这是针对PLPGSQL的。
DO $$
DECLARE tableId integer;
BEGIN
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id INTO tableId;
INSERT INTO Table2 (val) VALUES (tableId);
END $$;
使用psql进行测试(版本为10.3,服务器版本为9.6.8)
与Denis de Bernardy所给的答案一致...
如果您希望id在之后返回,且想将更多内容插入Table2:
with rows as (
INSERT INTO Table1 (name) VALUES ('a_title') RETURNING id
)
INSERT INTO Table2 (val, val2, val3)
SELECT id, 'val2value', 'val3value'
FROM rows
RETURNING val
lastval()
函数:
所以像这样:返回任何序列最近使用
nextval
获得的值
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (lastval());
只要在您的 INSERT 之间没有其他序列(在当前会话中)调用 nextval()
,这将正常工作。
Denis 在下面指出,我在上面警告过,使用 lastval()
可能会让您陷入麻烦,如果另一个序列使用 nextval()
访问,则可能会发生这种情况在您的 INSERT 之间。如果在 Table1
上有一个 INSERT 触发器,该触发器手动调用了序列上的 nextval()
或者更可能在具有 SERIAL
or BIGSERIAL
主键的表上进行了 INSERT。如果您想变得真正偏执(一件好事,毕竟他们确实是在追求您),那么您可以使用 currval()
,但您需要知道相关序列的名称:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
t_c_seq
,其中t
是表名,c
是列名,但您可以通过进入psql
并输入以下命令来查找:=> \d table_name;
然后查看相关列的默认值,例如:
id | integer | not null default nextval('people_id_seq'::regclass)
lastval()
是PostgreSQL版本的MySQL的LAST_INSERT_ID
。我之所以提到这一点,是因为很多人比较熟悉MySQL而不是PostgreSQL,因此将lastval()
与熟悉的东西联系起来可能会澄清问题。lastval
的问题在于,在Table1上的AFTER INSERT触发器后面可能会有一个基于序列的INSERT。那将在当前会话中,并且当您不希望时,可能会改变lastval()
。 - mu is too shorttable_ex
id 默认 nextval('table_id_seq'::regclass),
camp1 varchar
camp2 varchar
INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id
(some_query returning ...)
替换rows
现在可能有效(我还没有尝试过)。 - Denis de Bernardy