Resumo : neste tutorial, você aprenderá como usar a LAST_INSERT_ID()
função MySQL para retornar o primeiro inteiro gerado automaticamente e inserido com sucesso em uma AUTO_INCREMENT
coluna.
Introdução à função MySQL LAST_INSERT_ID()
No design de banco de dados, geralmente usamos uma chave substituta para gerar valores inteiros exclusivos para a coluna de chave primária de uma tabela usando o AUTO_INCREMENT
atributo:
CREATE TABLE table_name(
id INT AUTO_INCREMENT,
...,
PRIMARY KEY(id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quando você insere uma linha na tabela sem especificar um valor para a id
coluna, o MySQL gera automaticamente um número inteiro sequencial exclusivo para a id
coluna.
A LAST_INSERT_ID()
função retorna o primeiro inteiro gerado automaticamente ( BIGINT UNSIGNED
) inserido com sucesso para uma AUTO_INCREMENT
coluna.
Se você inserir várias linhas na tabela usando uma única INSERT
instrução, a LAST_INSERT_ID()
função retornará apenas o primeiro valor gerado automaticamente.
Se a inserção falhar, o resultado retornado por LAST_INSERT_ID()
permanecerá inalterado.
A LAST_INSERT_ID()
função funciona com base no princípio independente do cliente. Significa que o valor retornado pela LAST_INSERT_ID()
função para um cliente específico é o valor gerado por esse cliente apenas para garantir que cada cliente possa obter seu próprio ID exclusivo.
Exemplos de funções MySQL LAST_INSERT_ID
Vejamos um exemplo de uso LAST_INSERT_ID
da função MySQL.
1) Usando a função MySQL LAST_INSERT_ID() para obter valor ao inserir uma linha em uma tabela
Primeiro, crie uma nova tabela chamada messages
que tenha a id
coluna como chave primária e seu valor seja gerado automaticamente:
CREATE TABLE messages(
id INT AUTO_INCREMENT PRIMARY KEY,
description VARCHAR(250) NOT NULL
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, insira uma nova linha na messages
tabela:
INSERT INTO messages(description)
VALUES('MySQL last_insert_id');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, use a LAST_INSERT_ID
função para obter o valor inserido da id
coluna:
SELECT LAST_INSERT_ID();
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, tente inserir um valor nulo na description
coluna:
INSERT INTO messages(description)
VALUES(NULL);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL emitiu o seguinte erro:
Error Code: 1048. Column 'description' cannot be null
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Finalmente, use a LAST_INSERT_ID
função para obter o último valor inserido automaticamente:
SELECT LAST_INSERT_ID();
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O resultado permanece inalterado.
2) Usando a função MySQL LAST_INSERT_ID() para obter valor ao inserir várias linhas em uma tabela
Primeiro, insira três linhas na messages
tabela:
INSERT INTO messages(description)
VALUES
('Insert multiple rows'),
('LAST_INSERT_ID() example'),
('MySQL AUTO_INCREMENT');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, consulte os dados da messages
tabela:
SELECT * FROM messages;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Terceiro, use a LAST_INSERT_ID()
função para obter o valor inserido:
SELECT LAST_INSERT_ID();
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Como você pode ver claramente na saída, a LAST_INSERT_ID()
função retorna o valor gerado da primeira linha inserida com sucesso, não da última linha.
3) Usando a função MySQL LAST_INSERT_ID() em um procedimento armazenado
Primeiro, crie duas tabelas accounts
e phones
para teste:
CREATE TABLE accounts (
account_id INT AUTO_INCREMENT PRIMARY KEY,
first_name VARCHAR(255) NOT NULL,
last_name VARCHAR(255) NOT NULL
);
CREATE TABLE phones (
phone_id INT AUTO_INCREMENT,
account_id INT NOT NULL,
phone VARCHAR(25) NOT NULL,
description VARCHAR(255) NOT NULL,
PRIMARY KEY (phone_id , account_id),
FOREIGN KEY (account_id)
REFERENCES accounts (account_id)
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Segundo, crie um procedimento armazenado que insira uma conta com um número de telefone em ambas as tabelas:
DELIMITER $$
CREATE PROCEDURE CreateAccount(
fname VARCHAR(255),
lname VARCHAR(255),
phone VARCHAR(25),
description VARCHAR(255)
)
BEGIN
DECLARE l_account_id INT DEFAULT 0;
START TRANSACTION;
-- Insert account data
INSERT INTO accounts(first_name, last_name)
VALUES(fname, lname);
-- get account id
SET l_account_id = LAST_INSERT_ID();
-- insert phone for the account
IF l_account_id > 0 THEN
INSERT INTO phones(account_id, phone, description)
VALUES(l_account_id,phone,description);
-- commit
COMMIT;
ELSE
ROLLBACK;
END IF;
END$$
DELIMITER ;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
O procedimento armazenado insere uma linha na accounts
tabela, obtém o ID da conta usando a LAST_INSERT_ID()
função e usa esse ID da conta para inserir um telefone na phones
tabela.
Uma linha na phones
tabela só deverá existir se houver uma linha correspondente na accounts
tabela, portanto, envolvemos as instruções de inserção em uma transação .
Terceiro, chame o procedimento armazenado CreateAccount
para criar uma nova conta com um número de telefone:
CALL CreateAccount(
'John',
'Doe',
'(408)-456-4567',
'Emergency Contact'
);
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Quarto, consulte os dados das tabelas accounts
e phones
:
SELECT * FROM accounts;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
SELECT * FROM phones;
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Funciona conforme o esperado.
Por fim, tente criar uma nova conta com o valor do sobrenome nulo:
CALL CreateAccount(
'Jane',
null ,
'(408)-456-1111',
'Emergency Contact');
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
MySQL emitiu um erro:
Error Code: 1048. Column 'last_name' cannot be null
Linguagem de código: SQL (linguagem de consulta estruturada) ( sql )
Resumo
- Use a função MySQL
LAST_INSERT_ID
para obter o primeiro número inteiro gerado automaticamente e inserido com sucesso em umaAUTO_INCREMENT
coluna.