这样的事情可能吗?
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, server 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());
只要没有人nextval()
在您的 INSERT 之间调用任何其他序列(在当前会话中),这将正常工作。
正如Denis在下面提到的和我在上面警告过的那样,如果在 INSERT 之间lastval()
使用另一个序列访问,则使用会给你带来麻烦。nextval()
如果在序列上Table1
手动调用的 INSERT 触发器有一个 INSERT 触发器,nextval()
或者更有可能在具有SERIAL
或BIGSERIAL
主键的表上执行 INSERT,则可能会发生这种情况。如果你想变得非常偏执(一件好事,毕竟他们currval()
真的是你要得到你),那么你可以使用但你需要知道相关序列的名称:
INSERT INTO Table1 (name) VALUES ('a_title');
INSERT INTO Table2 (val) VALUES (currval('Table1_id_seq'::regclass));
自动生成的序列通常被命名为t_c_seq
wheret
是 table name 并且c
是 column name 但你总是可以通过进入psql
并说:
=> \d table_name;
然后查看相关列的默认值,例如:
id | integer | not null default nextval('people_id_seq'::regclass)
仅供参考:lastval()
或多或少是 MySQL 的LAST_INSERT_ID
. 我只提到这一点是因为很多人比 PostgreSQL 更熟悉 MySQL,所以链接lastval()
到熟悉的东西可能会澄清事情。
table_ex
id 默认 nextval('table_id_seq'::regclass),
camp1 varchar
camp2 varchar
INSERT INTO table_ex(camp1,camp2) VALUES ('xxx','123') RETURNING id