【发布时间】:2010-10-11 21:43:10
【问题描述】:
使用 SELECT 在同一 SQL 中获取 auto-id 值的最佳方法是什么?
一个论坛说添加这个“; has Return Scope_Identity()”
在 ASP 中工作的 SQL 结束。
PHP中有对应的方式吗?
【问题讨论】:
-
这个问题与任何使用 SQL 的事物相关,而不仅仅是 PHP。
标签: php sql auto-increment
使用 SELECT 在同一 SQL 中获取 auto-id 值的最佳方法是什么?
一个论坛说添加这个“; has Return Scope_Identity()”
在 ASP 中工作的 SQL 结束。
PHP中有对应的方式吗?
【问题讨论】:
标签: php sql auto-increment
这取决于您的数据库服务器。使用 MySQL,在插入查询后立即调用 mysql_insert_id()。使用 PostgreSQL,首先在序列上查询“select nextval(seq)”,并在插入查询中包含键。
如果另一个请求同时插入一条记录,则查询“select max(id) + 1 from tbl”可能会失败。
【讨论】:
在 postgres 中,最好的方法是:
insert into foos(name) values ('my_foo') returning id;
【讨论】:
这取决于您使用的数据库引擎。某些 DBMS,例如 Firebird,具有 RETURNING 子句,您可以将其添加到查询中。例如,如果您有一个名为 TABLE1 的表,其中包含名为 ID 的自动增量列,则可以使用:
insert into TABLE1(columns...) values (values...) returning ID;
它会像普通的 select 语句一样返回插入的 ID。
【讨论】:
在 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
【讨论】:
在 php 中:mysql_insert_id() http://us3.php.net/mysql_insert_id
或
如果你想从你的 mySql 选择查询中生成数字,你可以使用这个 编辑:
SELECT LAST_INSERT_ID(`1`) + 1 FROM table
【讨论】:
要非常小心:显然 select nextval(seq) 在高并发下不起作用 - 在您插入的时间和调用 select nextval(seq) 的时间之间可能会插入一些其他连接。始终在高并发测试工具中测试此类代码。
【讨论】:
在 SQL Server 中,使用 select 语句的插入可以有一个输出子句,该子句将返回标识值以及您可能需要识别哪个标识进入哪个记录的任何其他列。如果您使用的是 values 子句,则在插入后立即使用 select scope_identity()。
【讨论】: