SQL - INSERT并捕获id自动增量值

时间:2009-03-07 05:29:08

标签: php sql auto-increment

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

一个论坛说添加了这个“; has Return Scope_Identity()” 在SQL的最后工作在ASP。

PHP中有相应的方法吗?

7 个答案:

答案 0 :(得分:16)

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

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

答案 1 :(得分:7)

在postgres中,最好的方法是做一些事情:

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

答案 2 :(得分:3)

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

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

它将返回插入的ID,就像常规的select语句一样。

答案 3 :(得分:2)

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

e.g。

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

答案 4 :(得分:0)

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

如果要从mySql select查询中生成数字,可以使用此选项 修改

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 

答案 5 :(得分:0)

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

答案 6 :(得分:0)

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