摘要:在本教程中,您将学习如何使用 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)
第四,尝试在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)
结果不变。
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)
从输出中可以清楚地看到, LAST_INSERT_ID()
函数返回成功插入的第一行的生成值,而不是最后一行。
C) 在存储过程中使用 MySQL LAST_INSERT_ID()
函数
首先创建两个表accounts
和phones
进行测试:
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)
和phones
表:
SELECT * FROM phones;
Code language: SQL (Structured Query Language) (sql)
它按预期工作。
最后,尝试创建一个姓氏值为空的新帐户:
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 null
Code language: SQL (Structured Query Language) (sql)
在本教程中,您学习了如何使用 MySQL LAST_INSERT_ID
函数返回为AUTO_INCREMENT
列成功插入的第一个自动生成的整数。