当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《SQL:如何获取我刚刚插入的值的id?》经验,为你挑选了7个好方法。

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

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



1> SQLMenace..:

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


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

2> David Basara..:

这就是我使用自动生成的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();



3> UnkwnTech..:

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



4> Daniel Schaf..:

这在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)

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



5> Slartibartfa..:

同样没有语言不可知的响应,但在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();  
}  



6> Telcontar..:

如果您正在使用Oracle:

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

例:

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

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

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

并声明该语句的autput参数



7> Neall..:

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

CREATE TABLE mytable (
  id SERIAL PRIMARY KEY,
  lastname VARCHAR NOT NULL,
  firstname VARCHAR
);

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

INSERT INTO mytable (lastname, firstname) VALUES ('Washington', 'George');
SELECT lastval();

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

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

INSERT INTO mytable (lastname) VALUES ('Cher') RETURNING id;

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

推荐阅读
手机用户2402851335
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有