现在,我们计划要在每次用户注册(创建帐户)时自动生成UID(唯一会员编号/客户编号)的规则。
我们设置的规则: 名字姓氏= FL + 001 (与按帐户创建时间顺序排列的这两个字母关联的数字),即两个字母都是唯一的,并且只有当两个字母都重复时,数字才应该增加。
例如:
John Doe - JD001
John Denver - JD002
Jane Foster - JF001
Bob Bilkins - BB001
Bill Graham - BG001
答案 0 :(得分:1)
假设您的users
表为:
create table users (
user_id int unsigned auto_increment primary key,
fname varchar(50) not null,
lname varchar(50) not null,
uid varchar(50) unique
);
创建另一个表,该表将保留所有用户缩写的最后一个序列号:
create table uid_seq (
initials varchar(2) not null primary key,
seq int unsigned not null
);
然后为users
表编写一个插入触发器,它将为给定的首字母递增序列号,并将其返回以生成UID:
delimiter //
create trigger users_before_insert before insert on users
for each row begin
set @initials = concat(left(new.fname,1), left(new.lname, 1));
insert into uid_seq (initials, seq)
values (@initials, last_insert_id(1))
on duplicate key update seq = last_insert_id(seq + 1);
set new.uid = concat(@initials, lpad(last_insert_id(), 3, 0));
end //
delimiter ;
此方法是并发安全的,因为我们使用INSERT .. ON DUPLICATE KEY UPDATE ..
并使用LAST_INSERT_ID()
返回生成的值。这样,两个用户将永远不会获得相同的UID。在最坏的情况下,当服务器在处理插入操作时崩溃时,您可能会烧掉序列号。但是-如果您在事务中执行插入操作,那也不应该发生。
请注意,您仍然需要一个AUTO_INCREMENT ID,因为这是找出插入的哪一行的唯一方法,除非您具有自然的识别码。