SQL - 插入并捕获 id 自动增量值

Posted

技术标签:

【中文标题】SQL - 插入并捕获 id 自动增量值【英文标题】:SQL - INSERT and catch the id auto-increment value 【发布时间】:2010-10-11 21:43:10 【问题描述】:

使用 SELECT 在同一 SQL 中获取 auto-id 值的最佳方法是什么?

一个论坛说添加这个“; has Return Scope_Identity()” 在 ASP 中工作的 SQL 结束。

php中有对应的方式吗?

【问题讨论】:

这个问题与任何使用 SQL 的事物相关,而不仅仅是 PHP。 【参考方案1】:

这取决于您的数据库服务器。使用 mysql,在插入查询后立即调用 mysql_insert_id()。使用 PostgreSQL,首先在序列上查询“select nextval(seq)”,并在插入查询中包含键。

如果另一个请求同时插入一条记录,则查询“select max(id) + 1 from tbl”可能会失败。

【讨论】:

【参考方案2】:

在 postgres 中,最好的方法是:

insert into foos(name) values ('my_foo') returning id;

【讨论】:

【参考方案3】:

这取决于您使用的数据库引擎。某些 DBMS,例如 Firebird,具有 RETURNING 子句,您可以将其添加到查询中。例如,如果您有一个名为 TABLE1 的表,其中包含名为 ID 的自动增量列,则可以使用:

insert into TABLE1(columns...) values (values...) returning ID;

它会像普通的 select 语句一样返回插入的 ID。

【讨论】:

【参考方案4】:

在 Microsoft Transact SQL 中,您可以使用 @@IDENTITY。

例如

DECLARE @Table TABLE ( col0 INT IDENTITY, col1 VARCHAR(255), col2 VARCHAR(255))

INSERT INTO @Table (col1, col2) VALUES ('Hello','World!')

SELECT @@Identity

SELECT * FROM @Table

【讨论】:

永远不要使用@@identity,它不会总是给你正确的身份值,并且会导致非常糟糕的数据完整性问题。使用 scope_identity() 嗯,@@identity 是可以的,只要你知道它的作用和作用范围。如果您在表上有触发器(在触发器中插入带有标识列的表将导致 @@identity 被更新),或者如果表被复制,请小心。好的,使用 scope_identity() 可能更安全 :)【参考方案5】:

在 php 中:mysql_insert_id() http://us3.php.net/mysql_insert_id

如果你想从你的 mySql 选择查询中生成数字,你可以使用这个 编辑:

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 

【讨论】:

如果多个进程都在进行插入,那么选择最大值可能是个问题,难道不是吗? 如果您插入一条记录,然后删除一条记录,然后运行此查询,您将获得已删除记录的标识。在我知道的任何实现中,下一个插入都不会获得该身份。不惜一切代价避免这种情况...... 如果你想让它安全,你应该在表上设置一个读锁!即使那样,如果表中的某个地方存在间隙,我也不确定 DBMS 不会重新使用某些已删除的 id。【参考方案6】:

要非常小心:显然 select nextval(seq) 在高并发下不起作用 - 在您插入的时间和调用 select nextval(seq) 的时间之间可能会插入一些其他连接。始终在高并发测试工具中测试此类代码。

【讨论】:

这无关紧要,除非您使用 ID 进行排序,因为您使用的是 nextval(seq) 的结果,而不是对序列本身的另一个调用。【参考方案7】:

在 SQL Server 中,使用 select 语句的插入可以有一个输出子句,该子句将返回标识值以及您可能需要识别哪个标识进入哪个记录的任何其他列。如果您使用的是 values 子句,则在插入后立即使用 select scope_identity()。

【讨论】:

以上是关于SQL - 插入并捕获 id 自动增量值的主要内容,如果未能解决你的问题,请参考以下文章

在插入中立即使用自动增量值

SQL 创建表并设置自动增量值而不更改表

在插入时将自动增量值复制到另一列?

如何在单个查询(sql server)中插入1条记录后检索自动增量值

如何通过 SQL 插入增量值

如何迁移使用主键和自动增量值 SQL 2008 R2 的两个数据库