我想为表Postgres数据库创建插入脚本。该表应如下所示。
id | refid name
------------------------------------------------------------
autoinc | null | admin
autoinc | null | moderator
autoinc | id of moderator | readonly
autoinc | id of moderator | groupadmin
autoinc | id of groupadmin | rolesadmin
autoinc | id of rolesadmin | users
autoinc | id of users | null
我的问题是我不知道如何使用刚插入的id并在脚本的其余部分重新使用它。例如,我想插入带有版主名称的行,并在下面的2个插页中使用版主的ID。
我怎样才能做到这一点?
我试过
WITH moderator AS (
INSERT INTO table_name
(refid, name)
VALUES
(null, 'moderator')
RETURNING id
)
INSERT INTO sd_roles (refid,rname)
VALUES ((SELECT id FROM moderator), 'groupadmin')
但是它越来越嵌套,我需要用。编写。
答案 0 :(得分:1)
而不是嵌套,只需链接它们:
INSERT INTO table_name( refid, name )
VALUES( id, 'admin' );
INSERT INTO sd_roles( refid, name )
VALUES( null, 'moderator' )
RETURNING id;
INSERT INTO table_name( refid, name )
VALUES( id, 'readonly' ); -- using id of moderator
INSERT INTO table_name( refid, name )
VALUES( id, 'groupadmin' ) -- using id of readonly
RETURNING id;
INSERT INTO table_name( refid, name )
VALUES( id, 'rolesadmin' ) -- using id of groupadmin
RETURNING id;
INSERT INTO table_name( refid, name )
VALUES( id, 'users' ) -- using id of rolesadmin
RETURNING id;
INSERT INTO table_name( refid, name )
VALUES( id, null ); -- using id of users
答案 1 :(得分:0)
您始终可以定义变量并在其中返回返回的ID。但是,如果您不想使用变量。然后你可以使用lastval()
http://www.postgresql.org/docs/9.3/static/functions-sequence.html
“lastval:返回当前会话中nextval最近返回的值。此函数与currval相同,不同之处在于它不是将序列名称作为参数,而是获取nextval中使用的最后一个序列的值。当前会话。如果在当前会话中尚未调用nextval,则调用lastval是错误的。“
INSERT INTO table_name
(refid, name)
VALUES
(null, 'moderator');
INSERT INTO sd_roles
(refid,rname)
VALUES
(LASTVAL(), 'groupadmin')
答案 2 :(得分:-3)
您必须使用SCOPE_IDENTITY()
DECLARE @id int
INSERT INTO table_name
(refid, name)
VALUES
(null, 'moderator')
SET @id = SCOPE_IDENTITY()
INSERT INTO sd_roles (refid,rname)
VALUES (@id, 'groupadmin')