Ok, então vamos dizer que estou fazendo um mysql INSERT
em uma das minhas tabelas e a tabela possui a coluna item_id
que está definida como autoincrement
e primary key
.
Como faço para que a consulta produza o valor da chave primária recém-gerada item_id
na mesma consulta?
Atualmente, estou executando uma segunda consulta para recuperar o ID, mas isso dificilmente parece uma boa prática, considerando que isso pode produzir o resultado errado ...
Se isso não for possível, qual é a melhor prática para garantir a recuperação do ID correto?
mysql
insert
key
auto-increment
Amy Neville
fonte
fonte
INSERT
consulta como essa; por que você acha que isso pode produzir o resultado errado?Respostas:
Você precisa usar a
LAST_INSERT_ID()
função: http://dev.mysql.com/doc/refman/5.0/en/information-functions.html#function_last-insert-idPor exemplo:
Isso fará com que você retorne o
PRIMARY KEY
valor da última linha que você inseriu:Portanto, o valor retornado por
LAST_INSERT_ID()
é por usuário e não é afetado por outras consultas que possam estar sendo executadas no servidor por outros usuários .fonte
PRIMARY KEY
valor da última linha que você inseriu, porque é por conexão - cada conexão com o servidor manterá seu próprio valor para isso. Atualizei a resposta para esclarecer isso.Cuidado com o radar !! de "LAST_INSERT_ID ()" se tentar retornar esse valor da chave primária no PHP.
Eu sei que este segmento não está marcado como php, mas para quem encontrou esta resposta que procura retornar um ID de inserção do MySQL a partir de uma inserção com script PHP usando chamadas padrão mysql_query - ele não funcionará e não é óbvio sem capturar erros de SQL.
O mysqli mais recente suporta várias consultas - que LAST_INSERT_ID () é na verdade uma segunda consulta do original.
O IMO, um SELECT separado para identificar a última chave primária, é mais seguro que a função mysql_insert_id () opcional, retornando a ID AUTO_INCREMENT gerada na operação INSERT anterior.
fonte
LAST_INSERT_ID
é uma função MySQL por conexão. Se você consultar o último ID de inserção, é possível que uma conexão separada tenha executado uma gravação e você terá o ID errado.mysql_insert_id()
também funciona em uma base por conexão, mas também sofre um comportamento estranho, como visto aqui stackoverflow.com/a/897374/1305910 no comentário de Cliffordlife - deixa pra lá que todos nós deveríamos estar usandomysqli
A partir da
LAST_INSERT_ID()
documentação:Ou seja, se você tiver duas solicitações separadas para o script simultaneamente, elas não afetarão as outras
LAST_INSERT_ID()
(a menos que você esteja usando uma conexão persistente).fonte
Aqui o que você está procurando !!!
Essa é a melhor alternativa de
SCOPE_IDENTITY()
função usada noSQL Server
.Você também precisa ter em mente que isso só funcionará se
Last_INSERT_ID()
for acionado pela suaInsert
consulta. Essa é a consulta retorna o ID inserido no esquema. Você não pode obter o último ID inserido da tabela específica.Para mais detalhes, acesse o link O equivalente à função SQLServer SCOPE_IDENTITY () no mySQL?
fonte
Se você precisar do valor antes de inserir uma linha:
Você pode usar isso em uma inserção:
fonte
Você receberá estes parâmetros no resultado da sua consulta:
O
insertId
é exatamente o que você precisa.(NodeJS-mySql)
fonte
Se em python usando pymysql, no cursor você pode usar cursor.lastrowid
fonte
basta usar "$ last_id = mysqli_insert_id ($ conn);"
fonte
Se você estiver usando PHP: Em um objeto PDO, é possível invocar o método lastInsertId após a inserção.
Caso contrário, com um LAST_INSERT_ID, você poderá obter o valor assim:
SELECT LAST_INSERT_ID();
fonte
eu usei
return $this->db->insert_id();
para Codeigniterfonte
Eu só quero compartilhar minha abordagem sobre isso no PHP, alguns de vocês podem achar que não é uma maneira eficiente, mas isso é 100 melhor do que outras opções disponíveis.
gere uma chave aleatória e insira-a na tabela, criando uma nova linha. então você pode usar essa chave para recuperar a chave primária. use a atualização para adicionar dados e fazer outras coisas.
dessa maneira ajuda a proteger uma linha e ter a chave primária correta.
Realmente não recomendo isso, a menos que você não tenha outras opções.
fonte