类似于这篇文章的想法:如何生成一个4位数的无重复数字
然而,有没有一种方法可以在创建新用户时自动做到这一点,而不是将其设置为随机?
我希望能够在我的系统中创建一个新用户,并让他们的密码自动随机化一个4位数。AUTO_INCREMENT是唯一的自动选项吗?
我用过这个:
UPDATE patrons SET pin=FLOOR(1000 + (RAND() *8999)) WHERE pin = ?
然而,这不是我想要的,因为它必须手动完成。我在Java程序中的SQL DAO类中创建了一个方法,在创建用户后执行此操作,这样它就可以工作了,但如果我在Maria DB中创建一个新用户,它每次只会自动递增一个值。我更喜欢随机生成,无论我使用数据库的方式是什么。
我非常感谢你的帮助!
更新
我不需要密码是唯一的,因为用户也需要他们的图书馆卡号才能登录系统。
4位PIN不应该是唯一的,因为用户应该能够在需要时将其PIN更改为他们想要的任何PIN。此外,当用户超过10’000时,他们不可能是唯一的(根据鸽子洞原理(。
因此,这个代码:
UPDATE patrons SET pin=FLOOR(1000 + (RAND() *8999)) WHERE pin = ?
是错误,因为当只有一个用户决定更改PIN时,它将更改共享同一PIN的所有用户的PIN。应该为用户而不是号码更改PIN。
我想说:随机生成默认PIN,并提供一些熵,这将使下一个PIN难以猜测,这是最好的。出于安全原因,自动递增是不好的,标准随机生成器也是不好的:下一个PIN值只比递增值稍微难猜一点。这应该不同于根据用户请求更改PIN——在这种情况下,应该使用用户提供的号码。
例如,PostgreSQL具有用于加密强度随机生成的gen_random_bytes
。我建议在你选择的平台上寻找类似的东西。
创建一个在插入时触发的触发器:
create trigger client_pin
before insert on client
for each row set new.pin = 1000 + rand() * 9000;
请参阅下面的实时演示:
create table client (
id int auto_increment primary key,
name text not null,
pin int(4)
);
create trigger client_pin
before insert on client
for each row set new.pin = 1000 + rand() * 9000;
insert into client (name) values ('Adam');
insert into client (name) values ('Betty');
如果使用rand() * 10000
计算pin
,并通过格式化处理前导零,例如通过选择,效果会更好
lpad(pin, 4, '0') as pin
而不是直接选择CCD_ 5。