MySQL LAST_INSERT_ID函数

时间:2019-11-20 08:52:31  来源:igfitidea点击:

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

MySQL LAST_INSERT_ID()函数简介

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

CREATE TABLE table_name(
    id INT AUTO_INCREMENT,
    ...,
    PRIMARY KEY(id)
);

当您在表中插入一行而未指定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的新表进行测试。
在邮件表中,我们为id列设置了AUTO_INCREMENT属性。

CREATE TABLE messages(
    id INT AUTO_INCREMENT PRIMARY KEY,
    description VARCHAR(250) NOT NULL
);

其次,将新行插入到消息表中。

INSERT INTO messages(description)
VALUES('MySQL last_insert_id');

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

SELECT LAST_INSERT_ID();

第四,尝试在描述列中插入一个空值:

INSERT INTO messages(description) 
VALUES(NULL);

MySQL发出以下错误:

Error Code: 1048. Column 'description' cannot be null

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

SELECT LAST_INSERT_ID();

结果不变。

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

首先,将三行插入到消息表中:

INSERT INTO messages(description) 
VALUES
    ('Insert multiple rows'), 
    ('LAST_INSERT_ID() example'), 
    ('MySQL AUTO_INCREMENT');

其次,从邮件表中查询数据:

SELECT * FROM messages;

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

SELECT LAST_INSERT_ID();

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

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

首先,创建两个表帐户和电话进行测试:

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)
);

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

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 ;

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

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

CALL CreateAccount(
    'John',
    'Doe',
    '(408)-456-4567',
    'Emergency Contact'
);

第四,从accounts表中查询数据:

SELECT * FROM accounts;

和手机表:

SELECT * FROM phones;

它按预期工作。

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

CALL CreateAccount(
   'Jane', 
    null ,
    '(408)-456-1111',
    'Emergency Contact');

MySQL发出错误:

Error Code: 1048. Column 'last_name' cannot be null

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