Neste artigo, vou mostrar como podemos obter o ID do último registro inserido no banco de dados MySQL.
Eu já mostrei como recuperar o ID do último registro inserido no MS Access e no SQL Server nestes artigos:
Vamos fazer a mesma coisa para o MySQL.
Então, como obter o ID do último registro inserido no banco de dados MySQL? A resposta é:a depende… Sim, vai depender de como e quando você precisa obter essa informação.
Você deseja obter o último registro inserido ou o maior existente? Pense bem…
Existem 4 abordagens que você pode usar:
- Obter o valor do ID pelo maior valor da chave primária da tabela:SELECT MAX(ID) FROM tabela
Utiliza uma instrução SELECT usando a função MAX() que retorna o maior valor da coluna especificada, no caso a coluna ID. (*)
- Obter o ID usando uma consulta SELECT em ordem decrescente:SELECT ID FROM tabela ORDER BY ID DESC LIMIT 1
Utiliza uma instrução SELECT com a cláusula ORDER BY, que ordena os registros pelo ID na ordem descendente (DESC), limitando o número de registros retornados a 1.(LIMI 1).
Obs: Nem sempre o maior será o último. Um usuário pode inserir manualmente um registro fora da ordem e, neste caso, não tem como saber qual o último usando as opções 1 e 2.
- Obtendo o ID do último registro adicionado pelo comando INSERT INTO usando a função LAST_INSERT_ID:INSERT INTO tabela (nome) VALUES (‘Macoratti’); SELECT LAST_INSERT_ID();
A função LAST_INSET_ID() retorna o último registro inserido, mas deve ser executada na mesma conexão que inseriu os registros.
- Obtendo o ID do último registro adicionado pelo comando INSERT INTO usando a propriedade LastInsertedId do objeto Command do Connector do MySQL
Esta opção é bem simples. Basta obter o valor da propriedade LastInsertedId do objeto Command usado na conexão. Veja um exemplo de código:
if (cmd.LastInsertedId != 0) cmd.Parameters.Add(new MySqlParameter("ultimoId", cmd.LastInsertedId)); return Convert.ToInt32(cmd.Parameters["@ultimoId"].Value);
Geralmente, para obter o último registro inserido, a opção 4 é a mais fácil de usar, mas você tem que considerar as seguintes complicações:
- Transações simultâneas podem alterar o valor do último registro antes de você usar a função LAST_INSERT_ID() e ai você obtêm um valor que não corresponde ao real;
- A função somente vai funcionar se a instrução INSERT INTO executou sem erros;
- Se houver uma deleção de registros isso pode afetar o resultado;
Então o jeito é analisar o cenário de execução da consulta com cuidado, levando em conta os fatores que podem atuar no momento da execução da sua consulta.
A seguir, vou mostrar como usar a função em um cenário bem simples.
Recursos usados:
- Visual Studio Community 2015 (update 3)
- MySql
Nota: Baixe e use a versão Community 2015 do VS; ela é grátis e é equivalente a versão Professional.
Criando a tabela de exemplo
Você vai precisar ter instalado o MySQL versão Community, o MySQL Connector/NET, o MySQL Workbench e no mínimo o VS 2013 ou VS 2015 versão Community ou Professional.
Criando a tabela alunos
Vamos criar uma tabela chamada alunos em um banco de dados MySQL, usando o MySQL WorkBench.
A tabela terá a seguinte estrutura:
Observe que o campo ID é uma chave primária e Auto Increment, o que significa que o seu valor será incrementando automaticamente pelo SGBD após a inclusão de um registro.
Criando o projeto no Visual Studio 2015 Community
Abra o Visual Studio Community 2015 e clique em New Project. Selecione Visual C# e o template Windows Forms Application. Depois, informe o nome Mysql_LastID e clique no botão OK.
Instalando o pacote do MySQL Connector via Nuget
No menu Tools, clique em Nuget Packet Manager e, a seguir, em Manage Nuget Packages for Solution.
Clique na guia Browse, informe MySQL connector e, a seguir, escolha o pacote do MySql.Data marcando o projeto para o qual deseja instalar e clique em Install.
Definindo a interface com o usuário no formulário Form1.cs
No formulário Form1.cs inclua 4 Labels, 2 TextBox e dois Buttons e 1 DataGridView, conforme o leiaute abaixo:
Implementando o código para obter o ID do último registro inserido
Neste exemplo eu estou usando um código bem simples no formulário apenas para mostrar o uso do recurso. Não estou fazendo validações nem tratando erros.
No formulário Form1.cs defina a string de conexão e um objeto MySqlConnection:
string _conexaoMySQL = "server=localhost;user id=root;password=******;database=cadastro"; MySqlConnection con = null;
Para exibir os registros no DataGridView estou usando o método:
public DataTable SelecionaAlunos() { try { String sql = "SELECT * FROM alunos"; con = new MySqlConnection(_conexaoMySQL); MySqlCommand cmd = new MySqlCommand(sql, con); MySqlDataAdapter da = new MySqlDataAdapter(); da.SelectCommand = cmd; DataTable dt = new DataTable(); da.Fill(dt); return dt; } catch (Exception ex) { throw ex; } }
Estou carregando os dados no evento Load:
private void Form1_Load(object sender, EventArgs e) { dgvDados.DataSource = SelecionaAlunos(); }
Estou inserindo registros na tabela aluno usando o evento Click do botão Inserir:
private void btnInserir_Click(object sender, EventArgs e) { try { int ultimoID = InserirAluno(txtNome.Text, txtEmail.Text); lblResultado.Text = ultimoID.ToString(); dgvDados.DataSource = SelecionaAlunos(); } catch (Exception ex) { MessageBox.Show("Erro :" + ex.Message); } }
No método InserirAluno(), estou incluindo os dados e retornando um int que é o valor do último ID inserido na tabela:
public int InserirAluno(string _nome, string _email) { try { String sql = "INSERT INTO alunos (nome,email) VALUES (@nome,@email)"; con = new MySqlConnection(_conexaoMySQL); MySqlCommand cmd = new MySqlCommand(sql, con); cmd.Parameters.AddWithValue("@nome", _nome); cmd.Parameters.AddWithValue("@email", _email); con.Open(); cmd.ExecuteNonQuery(); // Verifica se existe um ultimo id inserido e adiciona um // parametro para tratá-lo if (cmd.LastInsertedId != 0) cmd.Parameters.Add(new MySqlParameter("ultimoId", cmd.LastInsertedId)); // Retorna o id do novo rgistro e convert de Int64 para Int32 (int). return Convert.ToInt32(cmd.Parameters["@ultimoId"].Value); } catch (Exception ex) { throw ex; } finally { con.Close(); } }
Executando o projeto e inserindo um registro, vemos o resultado abaixo exibindo o último ID do registro incluído:
Pegue o projeto completo aqui: MySQL_LastID.zip