MySQL LAST_INSERT_ID函数
简介:在本教程中,您将学习如何使用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列成功插入的第一个自动生成的整数。

