Я хотел бы убедиться, что когда пользователь хочет зарегистрировать имя пользователя в моей системе (веб-приложение), имя пользователя является уникальным, даже если регистр не рассматривается.Поэтому, если пользователь с именем «SuperMan» уже зарегистрирован, ни одному другому пользователю не должно быть разрешено регистрироваться как «superman» или «SUPERman».Это должно быть проверено на уровне базы данных.
В моей текущей реализации я делаю следующее:
select count(*) from user where lower(name) = lower(?) for update;
-- If the count is greater than 0, abort with an error
-- Determine a new ID for the user
insert into user (id, name, …) values (?, ?, …);
Я не уверен, будет ли «для обновления» блокировать базу данных достаточно далекотак что другие пользователи не смогут зарегистрироваться с недопустимым именем между двумя операторами SQL выше.Вероятно, это не 100% безопасное решение.К сожалению, я не могу использовать уникальные ключи в SQL, потому что они будут сравниваться только с учетом регистра.
Есть ли другое решение для этого?Как насчет следующего, чтобы добавить больше безопасности?
select count(*) from user where lower(name) = lower(?) for update;
-- If the count is greater than 0, abort with an error
-- Determine a new ID for the user
insert into user (id, name, …) values (?, ?, …);
-- Now count again
select count(*) from user where lower(name) = lower(?);
-- If the count is now greater than 1, do the following:
delete from user where id = ?;
-- Or alternatively roll back the transaction