若要防止上次使用的编号被编辑,可以在数据库设计中加入一张记录编号信息的表。该表可以存储自动编号的前缀、后缀、最后使用的编号等信息,每次新建数据时,从该表中获取最后使用的编号,自动加1。这样,即使用户手动编辑某个编号,下一个自动编号也不受影响。以下是一个示例代码:
CREATE TABLE autonumber_info (
id INT PRIMARY KEY AUTO_INCREMENT,
prefix VARCHAR(10),
suffix VARCHAR(10),
last_number INT
);
CREATE TABLE mytable (
id INT PRIMARY KEY AUTO_INCREMENT,
name VARCHAR(50),
code VARCHAR(20)
);
DELIMITER $$
CREATE TRIGGER tr_mytable BEFORE INSERT ON mytable
FOR EACH ROW
BEGIN
UPDATE autonumber_info SET last_number = last_number + 1 WHERE id = 1;
SET NEW.code = CONCAT((SELECT prefix FROM autonumber_info WHERE id = 1),
LPAD((SELECT last_number FROM autonumber_info WHERE id = 1), 5, '0'),
(SELECT suffix FROM autonumber_info WHERE id = 1));
END$$
DELIMITER ;
以上代码创建了两张表,autonumber_info
存储编号信息,mytable
是实际存储数据的表。创建一个触发器tr_mytable
,在每次插入新数据时更新last_number
并生成新的编号。新的编号由前缀、编号和后缀组成,使用MySQL的LPAD函数补全编号位数。