如何自动生成4位pin SQL



类似于这篇文章的想法:如何生成一个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。

最新更新