在Postgres中使用刚插入的id

时间:2014-06-24 11:02:47

标签: sql postgresql insert

我想为表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')

但是它越来越嵌套,我需要用。编写。

3 个答案:

答案 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')