我在表格中有许多记录,需要找到一种方法来分配一些
的唯一代码记录的截止日期约为2周,然后将其删除。
新记录以每天数千的速度不断创建。该表每秒获得几千个选择。
理想情况下,这应该仅在SQL中发生,因此我可以在插入&#34;之前将其添加到&#34;触发而不是点击数据库,选择检查应用程序端生成的代码的唯一性,这就是我现在正在玩的并且可能带来很大的开销,我甚至不会在这里发布代码。< / p>
答案 0 :(得分:2)
将整数主键转换为基数为26的数字...也就是字母。
0 becomes a
1 becomes b
25 becomes z
26 becomes aa
27 becomes ab
无需将此表示存储在数据库中,将其存储为整数并将其转换为显示级别的字母。
因为主键递增这不是特别安全,所以可以猜到。
如果您希望代码过期而不是相关数据,请创建第二个表,该表存储代码(创建时)和外键返回数据。使用INSERT触发器添加代码。
CREATE TABLE user_codes (
code INTEGER PRIMARY KEY AUTO_INCREMENT,
uid INTEGER FOREIGN KEY users(id),
created TIMESTAMP
);
如上所述,将整数代码转换为基数26,其中数字都是字母。
这也可以保护用户的主键,有人可能会做出恶意的事情,最好不要泄漏。
这也不是特别安全,可以猜到。您可以使用the technique in this answer to pick unique random numbers来改进它。
如果它必须是随机且唯一的,请考虑使用UUID_SHORT()
调用来生成唯一的64位数,这基本上是时间加上服务器ID。然后将其转换为基数26,然后转换为字母。不幸的是,这需要14个字母。
...但是因为它是基于时间的,所以这也不是特别安全,可以猜到。
最后,问问自己代码是否必须是全局唯一的,或者是否足以让人知道特定帐户的代码。例如,验证码。