Теперь правило, которое мы запланировали, чтобы UID (уникальный номер участника/номер клиента) генерировался автоматически при каждой регистрации пользователя (создается учетная запись).
Правило, которое мы установили: FirstName LastName = FL+ 001 (число, связанное с этими двумя буквами в хронологическом порядке создания учетной записи), т.е. Обе буквы уникальны, и только если число повторяется, при увеличении числа.
например:
John Doe - JD001
John Denver - JD002
Jane Foster - JF001
Bob Bilkins - BB001
Bill Graham - BG001
Предполагая, что ваша таблица 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, потому что это единственный способ узнать, какую строку вы только что вставили, если у вас нет естественного идентифицирующего ключа.