2010-09-10 44 views
2

这就是我在sql server中如何做到的。在postgres中插入带有连续出版物的脚本

insert into users(name) values('jhon'); 
set @id = @@identity; -- last serial 

insert into usersroles(@id, 1) 
insert into usersroles(@id, 2) 
insert into usersroles(@id, 3) 

如何在postgres(不创建函数)中做同样的事情?

回答

4
CREATE TABLE users (id SERIAL NOT NULL, name TEXT); 
CREATE TABLE userroles (user_id INT NOT NULL, role_id INT NOT NULL); 

INSERT 
INTO users (name) 
VALUES ('John'); 

INSERT 
INTO userroles (user_id, role_id) 
VALUES (CURRVAL('users_id_seq'), 1), 
     (CURRVAL('users_id_seq'), 2), 
     (CURRVAL('users_id_seq'), 3); 
+0

很酷,但有没有其他方式像使用声明或只有在plpgsql函数内? – Omu 2010-09-10 20:35:06

+1

@Omu:'DECLARE'只在'PL/PGSQL'中。你可以用'custom_variable_classes'来使用邪恶魔法来设置会话变量,但我不会推荐这个。实际上,'CURRVAL'解决方案有什么不好? – Quassnoi 2010-09-10 20:38:13

+0

@Quassnoi什么都没有,这只是我第一天使用postgres,我用的是sql server的东西 – Omu 2010-09-10 20:41:40

1

此外,您可以使用关键字DEFAULT指定列的默认值。 Postgres扩展RETURNING返回刚刚插入的id。

INSERT INTO users (id, name) VALUES (default, 'Bob') RETURNING id; 
+0

如何将返回的值插入到另一个表中而不先将其存储到变量中? – Quassnoi 2010-09-10 21:37:21

+0

你没有。使用返回的要点是将其填充到一个变量中。如果你不想使用变量,那么你需要使用currval() – 2010-09-11 05:12:28