我有一个带有自动递增主键的表,但我现在需要更改它,以便键入连续数字的人不能猜测主键。为了创建随机主键,我想我将创建一个表,其中包含随机顺序混洗的所有6位数字,并且键入1到n。
我的问题是,在不更改所有现有查询的情况下,如何使用自动递增的密钥与第二个表中相应索引处的6位数字之间的链接?
由于只有一个查询要插入此表,我想更改此内容以保持简单。我想查询第二个表中的下一个数字,并将其插入第一个表中的主键列。我认为的问题是两个查询可能同时命中服务器,并可能从第二个表返回相同的6位数。在MySQL中解决这个问题有哪些选择?
答案 0 :(得分:1)
为什么不使用UUID而不是这样做呢?您可以修改表格,在表格中添加此类型的列,您无需担心生成任何内容或跟踪它。
https://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid
答案 1 :(得分:1)
感谢您的建议,但实际上没有人回答我的问题。
我的表格看起来像:
id | pin | used
1 123456 1
2 258464 0
3 842364 0
我使用查询来获取下一个引脚:
SELECT id, pin FROM game_pins WHERE used = '0' ORDER BY id LIMIT 1;
然后我将该行更新为SET used = '1'
。
为了防止两个人获得相同的pin我使用InnoDB事务,在CodeIgniter中我通过将所有内容包装在其中来完成:
$this->db->trans_start();
...
$this->db->trans_complete();
答案 2 :(得分:0)
抛弃此附加表,只需使用rand()
生成介于100000和999999之间的随机数。选择此随机数,直到找不到为止。看起来你不需要经常这样做,所以它不一定非常快。但查询会更快,因为不需要额外的连接。
但请记住,它不比简单的自动增量更安全 - 用户可以在几个小时内尝试所有900k的可能性。