SQL - INSERT e pegar o valor de auto incremento ID
-
05-07-2019 - |
Pergunta
O que é a melhor maneira de obter o valor de auto-id no mesmo SQL com um SELECT?
Um fórum disse adicionando este
"; has Return Scope_Identity()
"
no final dos trabalhos de SQL em ASP.
Existe uma maneira correspondente no PHP?
Solução
Depende do seu servidor de banco de dados. Usando MySQL, chamar mysql_insert_id()
imediatamente após a sua consulta de inserção. Usando PostgreSQL, primeira consulta " select nextval(seq)
" na sequência e incluem a chave em sua consulta de inserção.
Consultando para "select max(id) + 1 from tbl
" pode falhar se outra solicitação insere um registro ao mesmo tempo.
Outras dicas
Em postgres a melhor maneira é fazer algo como:
insert into foos(name) values ('my_foo') returning id;
Depende do motor de banco de dados você está usando. Alguns DBMS, como cláusula Firebird por exemplo, RETORNANDO você pode adicionar à sua consulta. Por exemplo, se você tem uma tabela chamada Tabela1 com coluna autoincrement chamado ID, você pode usar isto:
insert into TABLE1(columns...) values (values...) returning ID;
E seria devolver o ID inserido como uma instrução select regular.
Em Microsoft Transact SQL você pode usar @@ IDENTITY.
por exemplo.
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
Em php: mysql_insert_id () http://us3.php.net/mysql_insert_id
ou
Se você quisesse genterate o número do seu mySql consulta seleção, você poderia usar este EDIT:
SELECT LAST_INSERT_ID(`1`) + 1 FROM table
Tenha muito cuidado: Aparentemente selecionar nextval (seq) não funciona em alta concorrência - alguma outra conexão pode inserir entre o momento em que você inserido e o momento em que você chamou selecionar nextval (seq). Sempre testar esse código em equipamentos de teste de alta concorrência.
No SQL Server uma inserção usando a instrução select pode ter uma cláusula de saída que irá retornar o valor de identidade e qualquer outro colunas poderá ser necessário identificar qual a identidade vai para qual registro. Se você estiver usando uma cláusula de valores, em seguida, usar select SCOPE_IDENTITY () imediatamente após a inserção.