MySQL LAST_INSERT_ID Function

摘要:在本教程中,您将学习如何使用 MySQL LAST_INSERT_ID()函数返回为AUTO_INCREMENT列成功插入的第一个自动生成的整数。

MySQL LAST_INSERT_ID()函数简介

在数据库设计中,我们经常使用代理键通过AUTO_INCREMENT属性为表的主键列生成唯一的数值:

CREATE TABLE table_name(
    id INT AUTO_INCREMENT,
    ...,
    PRIMARY KEY(id)
);Code language: SQL (Structured Query Language) (sql)

当您在表中插入一行而不指定id列的值时,MySQL 会自动为id列生成一个连续的唯一整数。

LAST_INSERT_ID()函数返回为AUTO_INCREMENT列成功插入的第一个自动生成的整数 ( BIGINT UNSIGNED )。

如果使用单个INSERT语句将多行插入表中,则LAST_INSERT_ID()函数仅返回第一个自动生成的值。

如果插入失败, LAST_INSERT_ID()返回的结果保持不变。

LAST_INSERT_ID()函数基于独立于客户端的原则工作。这意味着LAST_INSERT_ID()函数为特定客户端返回的值是该客户端生成的值,只是为了确保每个客户端都能获得自己的唯一ID。

MySQL LAST_INSERT_ID函数示例

让我们看一个使用 MySQL LAST_INSERT_ID函数的示例。

A) 使用 MySQL LAST_INSERT_ID()函数在向表中插入一行时获取值

首先,创建一个名为messages的新表用于测试。在messages表中,我们为id列设置AUTO_INCREMENT属性。

CREATE TABLE messages(
    id INT AUTO_INCREMENT PRIMARY KEY,
    description VARCHAR(250) NOT NULL
);Code language: SQL (Structured Query Language) (sql)

其次,在messages表中插入一个新行。

INSERT INTO messages(description)
VALUES('MySQL last_insert_id');Code language: SQL (Structured Query Language) (sql)

三、使用MySQL LAST_INSERT_ID函数获取id列的插入值:

SELECT LAST_INSERT_ID();Code language: SQL (Structured Query Language) (sql)
MySQL LAST_INSERT_ID 函数示例

第四,尝试在description列中插入空值:

INSERT INTO messages(description) 
VALUES(NULL);Code language: SQL (Structured Query Language) (sql)

MySQL 发出以下错误:

Error Code: 1048. Column 'description' cannot be null
Code language: SQL (Structured Query Language) (sql)

最后,使用LAST_INSERT_ID函数获取最后一次自动插入的值:

SELECT LAST_INSERT_ID();Code language: SQL (Structured Query Language) (sql)
MySQL LAST_INSERT_ID 函数示例

结果不变。

B) 在向表中插入多行时使用 MySQL LAST_INSERT_ID()函数获取值

首先,在messages表中插入三行:

INSERT INTO messages(description) 
VALUES
    ('Insert multiple rows'), 
    ('LAST_INSERT_ID() example'), 
    ('MySQL AUTO_INCREMENT');Code language: SQL (Structured Query Language) (sql)

其次,从messages表中查询数据:

SELECT * FROM messages;Code language: SQL (Structured Query Language) (sql)

第三,使用LAST_INSERT_ID()函数获取插入的值:

SELECT LAST_INSERT_ID();Code language: SQL (Structured Query Language) (sql)
MySQL LAST_INSERT_ID 函数 - 插入多行

从输出中可以清楚地看到, LAST_INSERT_ID()函数返回成功插入的第一行的生成值,而不是最后一行。

C) 在存储过程中使用 MySQL LAST_INSERT_ID()函数

首先创建两个表accountsphones进行测试:

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)
);Code language: SQL (Structured Query Language) (sql)

其次,创建一个存储过程,将带有电话号码的帐户插入到两个表中:

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 ;Code language: SQL (Structured Query Language) (sql)

该存储过程会向accounts表中插入一行,使用LAST_INSERT_ID()函数获取账户 ID,然后使用该账户 ID 将电话插入到phones表中。仅当accounts表中存在相应行时, phones表中的行才应存在,因此,我们将这两个插入放入一个事务中。

第三,调用存储过程CreateAccount创建一个带有电话号码的新帐户:

CALL CreateAccount(
    'John',
    'Doe',
    '(408)-456-4567',
    'Emergency Contact'
);Code language: SQL (Structured Query Language) (sql)

四、从accounts表中查询数据:

SELECT * FROM accounts;Code language: SQL (Structured Query Language) (sql)
MySQL LAST_INSERT_ID - 存储过程帐户表

phones表:

SELECT * FROM phones;Code language: SQL (Structured Query Language) (sql)
MySQL LAST_INSERT_ID - 存储过程电话表

它按预期工作。

最后,尝试创建一个姓氏值为空的新帐户:

CALL CreateAccount(
   'Jane', 
    null ,
    '(408)-456-1111',
    'Emergency Contact');Code language: SQL (Structured Query Language) (sql)

MySQL 发出错误:

Error Code: 1048. Column 'last_name' cannot be nullCode language: SQL (Structured Query Language) (sql)

在本教程中,您学习了如何使用 MySQL LAST_INSERT_ID函数返回为AUTO_INCREMENT列成功插入的第一个自动生成的整数。

本教程有帮助吗?