我想使用我的名字,姓氏和数字组合生成一个自定义

时间:2019-02-19 08:46:46

标签: mysql

现在,我们计划要在每次用户注册(创建帐户)时自动生成UID(唯一会员编号/客户编号)的规则。

我们设置的规则: 名字姓氏= FL + 001 (与按帐户创建时间顺序排列的这两个字母关联的数字),即两个字母都是唯一的,并且只有当两个字母都重复时,数字才应该增加。

例如:

John Doe - JD001
John Denver - JD002
Jane Foster - JF001
Bob Bilkins - BB001
Bill Graham - BG001

1 个答案:

答案 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,因为这是找出插入的哪一行的唯一方法,除非您具有自然的识别码。