SQL:如何获取我刚刚插入的值的id?

Niy*_*yaz 75 sql-server

我在表格中插入了一些值.有一列其值是自动生成的.在我的代码的下一个语句中,我想要检索此值.

你能告诉我怎么做正确的方法吗?

SQL*_*ace 56

@@IDENTITY 不是范围安全的,如果在原始表上有插入触发器,则会从另一个表中返回id,始终使用 SCOPE_IDENTITY()

  • @KM评论中的URL被截断.希望这个链接有效:[SCOPE_IDENTITY错误与多处理器并行计划和解决方案](http://blog.sqlauthority.com/2009/03/24/sql-server-2008-scope_identity-bug-with-multi-processor-并行式 - 和 - 溶液/) (4认同)
  • sql server 2005中存在SCOPE_IDENTITY()的已知错误,不确定2008年,OUTPUT子句可以在必要时返回一组ID (2认同)

Dav*_*rab 29

这就是我使用自动生成的ID为MSSQL执行存储过程的方法.

CREATE PROCEDURE [dbo].[InsertProducts]
    @id             INT             = NULL OUT,
    @name           VARCHAR(150)    = NULL,
    @desc           VARCHAR(250)    = NULL

AS

    INSERT INTO dbo.Products
       (Name,
        Description)
    VALUES
       (@name,
        @desc)

    SET @id = SCOPE_IDENTITY();
Run Code Online (Sandbox Code Playgroud)


Unk*_*ech 14

如果您使用PHP和MySQL,则可以使用mysql_insert_id()函数,该函数将告诉您刚刚输入的项目的ID.
但是没有你的语言和DBMS,我只是在黑暗中拍摄.


Dan*_*fer 14

这在SQL 2005中运行得非常好:

DECLARE @inserted_ids TABLE ([id] INT);

INSERT INTO [dbo].[some_table] ([col1],[col2],[col3],[col4],[col5],[col6])
OUTPUT INSERTED.[id] INTO @inserted_ids
VALUES (@col1,@col2,@col3,@col4,@col5,@col6)
Run Code Online (Sandbox Code Playgroud)

如果您的INSERT语句插入多行,它的好处是返回所有ID.


Sla*_*ast 11

同样没有语言不可知的响应,但在Java中它是这样的:

Connection conn = Database.getCurrent().getConnection();  
PreparedStatement ps =  conn.prepareStatement(insertSql, Statement.RETURN_GENERATED_KEYS);
try {  
    ps.executeUpdate();  
    ResultSet rs = ps.getGeneratedKeys();  
    rs.next();  
    long primaryKey = rs.getLong(1);  
} finally {  
    ps.close();  
}  
Run Code Online (Sandbox Code Playgroud)


Tel*_*tar 8

如果您正在使用Oracle:

插入表(字段....)值(值...)RETURNING(字段列表...)INTO(变量...)

例:

插入人(名称)值('杰克')将ID_PERSON归入vIdPerson

或者如果你正在调用...带有CallableStatement的Java(sry,这是我的字段)

插入人(姓名)值('杰克')返回ID_PERSON INTO?

并声明该语句的autput参数


Nea*_*all 6

没有标准的方法(就像没有标准方法来创建自动递增ID一样).以下是在PostgreSQL中执行此操作的两种方法.假设这是你的表:

CREATE TABLE mytable (
  id SERIAL PRIMARY KEY,
  lastname VARCHAR NOT NULL,
  firstname VARCHAR
);
Run Code Online (Sandbox Code Playgroud)

你可以在两个语句中完成它,只要它们是同一连接中的连续语句(这在PHP中是安全的连接池,因为PHP在脚本完成之前不会将连接返回池):

INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George');
SELECT lastval();
Run Code Online (Sandbox Code Playgroud)

lastval()为您提供当前连接中使用的最后一个自动生成的序列值.

另一种方法是在INSERT语句中使用PostgreSQL的RETURNING子句:

INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;
Run Code Online (Sandbox Code Playgroud)

此表单返回结果集,就像SELECT语句一样,并且还可以方便地返回任何类型的计算默认值.