SQL - INSERT и поймать значение автоинкремента id - PullRequest
16 голосов
/ 07 марта 2009

Каков наилучший способ получить значение auto-id в том же SQL с помощью SELECT?

Форум сказал, добавив это "; has Return Scope_Identity()"
в конце SQL работает в ASP.

Есть ли соответствующий путь в PHP?

Ответы [ 7 ]

16 голосов
/ 07 марта 2009

Это зависит от вашего сервера базы данных. Используя MySQL, вызовите mysql_insert_id() сразу после запроса вставки. Используя PostgreSQL, сначала выполните запрос «select nextval(seq)» в последовательности и включите ключ в запрос вставки.

Запрос «select max(id) + 1 from tbl» может завершиться неудачей, если другой запрос одновременно вставит запись.

7 голосов
/ 21 сентября 2009

В postgres лучший способ сделать что-то вроде:

insert into foos(name) values ('my_foo') returning id;
3 голосов
/ 07 марта 2009

Это зависит от используемого вами механизма базы данных. Некоторые СУБД, такие как, например, Firebird , имеют предложение RETURNING, которое можно добавить в запрос. Например, если у вас есть таблица с именем TABLE1 со столбцом автоинкремента с именем ID, вы можете использовать это:

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

И он вернет вставленный идентификатор, как обычный оператор выбора.

2 голосов
/ 10 июля 2009

В 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
0 голосов
/ 10 июля 2009

В SQL Server вставка, использующая оператор select, может иметь предложение output, которое будет возвращать значение идентификатора и любые другие столбцы, которые могут вам понадобиться, чтобы определить, какая идентификация идет к какой записи. Если вы используете предложение values, тогда используйте select scope_identity () сразу после вставки.

0 голосов
/ 10 июля 2009

Будьте очень осторожны: очевидно, что nextval (seq) не работает в режиме высокого параллелизма - какое-то другое соединение может вставляться между временем, когда вы вставили, и временем, когда вы вызывали select nextval (seq). Всегда проверяйте такой код в тестах с высокой степенью параллелизма.

0 голосов
/ 07 марта 2009

В php: mysql_insert_id () http://us3.php.net/mysql_insert_id

или

Если вы хотите создать число из вашего запроса на выборку mySql, вы можете использовать это EDIT:

SELECT LAST_INSERT_ID(`1`) + 1 FROM table 
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...