sim, você esta consulta retornará o último id da tabela. Mas uma condição é que o ID deve ser uma chave primária. Portanto, você pode evitar o arrependimento.
sathish
7
@sathish: O principal problema desse método é a simultaneidade .
CMS
3
Para elaborar: O problema com isso é que se alguém inserir algo na tabela entre o seu INSERTe a consulta por MAX(id), você pode obter um id que não é o seu último id.
deceze
3
@Jocelyn essa pergunta foi feita um ano depois com milhares de visualizações a menos do que esta pergunta.
Naftali também conhecido como Neal
3
@Neal, você está certo. A outra questão deve ser encerrada como duplicado desta.
O problema com este é se você tiver muitas inserções acontecendo (por exemplo, seu banco de dados também registra algo), você pode obter o ID errado.
Mike
@Mike Não se você usar mysql_insert_idlogo após seu mysql_query. Se é claro que você executa várias outras consultas na mesma conexão, bem, não há nada que possa ajudá-lo nisso.
deceze
7
Para garantir que você NUNCA obterá um id errado, envolva seu código com uma TRANSAÇÃO .
Marcelo Assis
28
O mysql garante que este seja o último id DA CONEXÃO ATUAL, então não haverá problemas se você colocar esta instrução logo após a consulta de inserção. Não se preocupe com outros processos fazendo inserções. Não há necessidade de envolver isso em uma transação. O manual do mysql diz: "O ID que foi gerado é mantido no servidor por conexão. Isso significa que o valor retornado pela função para um determinado cliente é o primeiro valor AUTO_INCREMENT gerado para a instrução mais recente afetando uma coluna AUTO_INCREMENT por esse cliente . Este é o motivo pelo qual você não deve usar select MAX (ID)
woens,
1
@deceze, o que há com esse PDOpreconceito que vemos em todos os lugares? Vejamos a comparação de recursos novamente. É claro que mysqlié o vencedor quando você precisa sujar as mãos com coisas de baixo nível. Em outras palavras, mesmo se alguém escolher o PDO, ele eventualmente precisará usar de mysqliqualquer maneira.
Pacerier
53
existe uma função para saber qual foi o último id inserido na conexão atual
mysql_query('INSERT INTO FOO(a) VALUES(\'b\')');
$id = mysql_insert_id();
Além disso, usar o max é uma má ideia porque pode levar a problemas se o seu código for usado ao mesmo tempo em duas sessões diferentes.
O que você escreveu lhe daria o melhor, idsupondo que eles fossem únicos e com incremento automático, o que seria ótimo supondo que você não tem problema em convidar problemas de concorrência.
Como você está usando o MySQL como banco de dados, existe a função específica LAST_INSERT_ID()que só funciona na conexão atual que fez a inserção.
PHP oferece uma função específica para isso também chamada mysql_insert_id.
Além disso, isso está errado porque sugere o uso de uma biblioteca obsoleta. Sério, exclua isso
STT LCU
@STTLCU Qual snippet aqui está obsoleto?
TheBlackBenzKid
@TheBlackBenzKid ambos, porque são baseados nas funções mysql_ *
STT LCU
@Rahul $ id = last_insert_id (); não está funcionando, pois pode estar obsoleto.
Esha de
3
Para obter o último id inserido no codeigniter Após executar a consulta de inserção, basta usar uma função chamada insert_id()no banco de dados, ela retornará o último id inserido
Ex:
$this->db->insert('mytable',$data);
echo $this->db->insert_id();//returns last inserted id
Pode ser usado mysql_insert_id(), mas há uma observação específica sobre como usá-lo, você deve chamá-lo após a consulta INSERT executada, ou seja, na mesma sessão de script. Se você usá-lo de outra forma, ele não funcionará corretamente.
$selectquery="SELECT id FROM tableName ORDER BY id DESC LIMIT 1";
$result = $mysqli->query($selectquery);
$row = $result->fetch_assoc();
echo $row['id'];
Tenho dúvidas sobre isso, já que esse SQL está simplesmente errado no contexto da questão ... Além disso, esse método parece sujeito a possíveis condições de corrida quando dois ou mais clientes executam esse SQL ao mesmo tempo ... Não tenho certeza a rapidez com que os dados desta coluna são atualizados após uma inserção que me deixa em dúvida ... As funções PHP que podem obter o último id são baseadas no nível de conexão / sessão (faz mais ou menos o mesmo que LAST_INSERT_ID () do MySQL ), o que torna a condição de corrida salva
Raymond Nijland
1
É triste não ver respostas com um exemplo.
Usando Mysqli :: $ insert_id :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$mysqli->query($sql);
$last_inserted_id=$mysqli->insert_id;// returns last ID
Usando PDO :: lastInsertId :
$sql="INSERT INTO table (col1, col2, col3) VALUES (val1, val2, val3)";
$database->query($sql);
$last_inserted_id=$database->lastInsertId();// returns last ID
Usando MySQLitransaction eu às vezes não conseguia mysqli::$insert_id, porque retornava 0. Principalmente se eu estivesse usando stored procedures, que executam INSERTs. Portanto, há outra maneira dentro da transação:
Isso retorna o último id inserido da conexão atual, portanto, se você estiver gerenciando suas conexões corretamente, isso deve funcionar. Funcionou para mim, pelo menos.
Por toda essa discussão, presumo que a razão para verificar o id máximo é saber qual id deve ser o próximo. (Se meu id máximo for 5, o próximo será 5 + 1 = 6).
>> Se este não for o motivo, minhas melhores desculpas
Caso se outra pessoa inserir informações entre o seu CHECK e INSERT, você obterá um ID incorreto.
Portanto, pode ser resolvido se você criar um hash que possa incluir carimbo de data / hora ou outro valor exclusivo.
Então, na mesma função você pode inserir suas informações com valores vazios e seu hash. Isso criaria ID se você tiver AUTO_INCRECEMENT selecionado.
Então, na mesma função, você ainda teria seu hash e poderia procurar por id com o mesmo hash. E então você pode preencher os valores vazios com mysql UPDATE.
Isso inclui um pouco mais de conexões, mas ainda é uma maneira de fazer isso ...
Se sua tabela tem coluna AUTO INCREMENT como UserID, Emp_ID, .. então você pode usar esta consulta para obter o último registro inserido
SELECT * FROM table_name onde UserID = (selecione MAX (UserID) from table_name)
No código PHP:
$con = mysqli_connect('localhost','userid','password','database_name');if(!$con){die('Could not connect: '. mysqli_error($con));}
$sql ="SELECT * FROM table_name where UserID=(select MAX(UserID)from table_name)";
$result = mysqli_query($con, $sql);
Então você pode usar os dados buscados como seu requisito
INSERT
e a consulta porMAX(id)
, você pode obter um id que não é o seu último id.Respostas:
Se você estiver usando PDO, use
PDO::lastInsertId
.Se você estiver usando o Mysqli, use
mysqli::$insert_id
.Se você ainda estiver usando o Mysql:
Mas se for preciso, use
mysql_insert_id
.fonte
mysql_insert_id
logo após seumysql_query
. Se é claro que você executa várias outras consultas na mesma conexão, bem, não há nada que possa ajudá-lo nisso.PDO
preconceito que vemos em todos os lugares? Vejamos a comparação de recursos novamente. É claro quemysqli
é o vencedor quando você precisa sujar as mãos com coisas de baixo nível. Em outras palavras, mesmo se alguém escolher o PDO, ele eventualmente precisará usar demysqli
qualquer maneira.existe uma função para saber qual foi o último id inserido na conexão atual
Além disso, usar o max é uma má ideia porque pode levar a problemas se o seu código for usado ao mesmo tempo em duas sessões diferentes.
Essa função é chamada mysql_insert_id
fonte
Está certo. Você também pode usar LAST_INSERT_ID ()
fonte
select max(id)from table
está tudo bem?Com PDO :
Com Mysqli :
Por favor, não use
mysql_*
funções no novo código . Eles não são mais mantidos e estão oficialmente obsoletos . Veja a caixa vermelha ? Emvez disso,aprenda sobre as instruções preparadas e use PDO ou MySQLi - este artigo o ajudará a decidir quais. Se você escolher PDO, aqui está um bom tutorial .fonte
PDO
preconceito nós ........O que você escreveu lhe daria o melhor,
id
supondo que eles fossem únicos e com incremento automático, o que seria ótimo supondo que você não tem problema em convidar problemas de concorrência.Como você está usando o MySQL como banco de dados, existe a função específica
LAST_INSERT_ID()
que só funciona na conexão atual que fez a inserção.PHP oferece uma função específica para isso também chamada
mysql_insert_id
.fonte
Tente isso deve funcionar bem:
fonte
Você pode obter a última id inserida pela função interna de php
mysql_insert_id();
você também pode obter a última id por
fonte
Para obter o último id inserido no codeigniter Após executar a consulta de inserção, basta usar uma função chamada
insert_id()
no banco de dados, ela retornará o último id inseridoEx:
em uma linha
fonte
Pode ser usado
mysql_insert_id()
, mas há uma observação específica sobre como usá-lo, você deve chamá-lo após a consulta INSERT executada, ou seja, na mesma sessão de script. Se você usá-lo de outra forma, ele não funcionará corretamente.fonte
Limpo e simples -
fonte
NOTA: se você fizer múltiplas inserções com uma instrução mysqli :: insert_id não estará correto.
A mesa:
create table xyz (id int(11) auto_increment, name varchar(255), primary key(id));
Agora se você fizer:
insert into xyz (name) values('one'),('two'),('three');
O mysqli :: insert_id será 1 e não 3.
Para obter o valor correto, faça:
mysqli::insert_id + mysqli::affected_rows) - 1
Este foi um documento, mas é um pouco obscuro.
fonte
Eu prefiro usar uma sintaxe MySQL pura para obter a última id de auto_increment da tabela que desejo.
php mysql_insert_id () e mysql last_insert_id () fornecem apenas o ID da última transação.
Se você deseja o último ID auto_incremented de qualquer tabela em seu esquema (não apenas a última transação), você pode usar esta consulta
É isso aí.
fonte
É triste não ver respostas com um exemplo.
Usando Mysqli :: $ insert_id :
Usando PDO :: lastInsertId :
fonte
Usando
MySQLi
transaction eu às vezes não conseguiamysqli::$insert_id
, porque retornava 0. Principalmente se eu estivesse usando stored procedures, que executamINSERT
s. Portanto, há outra maneira dentro da transação:fonte
Use mysqli porque mysql é depreciativo
fonte
eu tentei
mysqli_insert_id ($ dbConnectionObj)
Isso retorna o último id inserido da conexão atual, portanto, se você estiver gerenciando suas conexões corretamente, isso deve funcionar. Funcionou para mim, pelo menos.
fonte
Use o PDP e tente isso
fonte
$ lastid = mysql_insert_id ();
fonte
Por toda essa discussão, presumo que a razão para verificar o id máximo é saber qual id deve ser o próximo. (Se meu id máximo for 5, o próximo será 5 + 1 = 6).
>> Se este não for o motivo, minhas melhores desculpas
Caso se outra pessoa inserir informações entre o seu CHECK e INSERT, você obterá um ID incorreto.
Portanto, pode ser resolvido se você criar um hash que possa incluir carimbo de data / hora ou outro valor exclusivo.
Então, na mesma função você pode inserir suas informações com valores vazios e seu hash. Isso criaria ID se você tiver AUTO_INCRECEMENT selecionado.
Então, na mesma função, você ainda teria seu hash e poderia procurar por id com o mesmo hash. E então você pode preencher os valores vazios com mysql UPDATE.
Isso inclui um pouco mais de conexões, mas ainda é uma maneira de fazer isso ...
Boa sorte para resolver isso.
fonte
Se sua tabela tem coluna AUTO INCREMENT como UserID, Emp_ID, .. então você pode usar esta consulta para obter o último registro inserido SELECT * FROM table_name onde UserID = (selecione MAX (UserID) from table_name) No código PHP:
Então você pode usar os dados buscados como seu requisito
fonte
fonte