Função MySQL LAST_INSERT_ID

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_INCREMENTcoluna.

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_INCREMENTatributo:

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 idcoluna, o MySQL gera automaticamente um número inteiro sequencial exclusivo para a idcoluna.

A LAST_INSERT_ID()função retorna o primeiro inteiro gerado automaticamente ( BIGINT UNSIGNED) inserido com sucesso para uma  AUTO_INCREMENTcoluna.

Se você inserir várias linhas na tabela usando uma única INSERTinstruçã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 messagesque tenha a idcoluna 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 messagestabela:

INSERT INTO messages(description)
VALUES('MySQL last_insert_id');Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Terceiro, use a LAST_INSERT_IDfunção para obter o valor inserido da idcoluna:

SELECT LAST_INSERT_ID();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Exemplo de função MySQL LAST_INSERT_ID

Quarto, tente inserir um valor nulo na descriptioncoluna:

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 nullLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Finalmente, use a LAST_INSERT_IDfunção para obter o último valor inserido automaticamente:

SELECT LAST_INSERT_ID();Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
Exemplo de função MySQL LAST_INSERT_ID

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 messagestabela:

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 messagestabela:

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 )
Função MySQL LAST_INSERT_ID - insira várias linhas

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 accountse phonespara 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 accountstabela, obtém o ID da conta usando a LAST_INSERT_ID()função e usa esse ID da conta para inserir um telefone na phonestabela.

Uma linha na phonestabela só deverá existir se houver uma linha correspondente na accountstabela, portanto, envolvemos as instruções de inserção em uma transação .

Terceiro, chame o procedimento armazenado CreateAccountpara 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 accountse phones:

SELECT * FROM accounts;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL LAST_INSERT_ID - Tabela de contas de procedimento armazenado
SELECT * FROM phones;Linguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )
MySQL LAST_INSERT_ID - Tabela de telefones de procedimento armazenado

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 nullLinguagem de código:  SQL (linguagem de consulta estruturada)  ( sql )

Resumo

  • Use a função MySQL LAST_INSERT_IDpara obter o primeiro número inteiro gerado automaticamente e inserido com sucesso em uma AUTO_INCREMENTcoluna.

Deixe um comentário

O seu endereço de email não será publicado. Campos obrigatórios marcados com *