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列成功插入的第一个自动生成的整数。