MySQL使用'随机'号作为主键

时间:2013-10-11 15:48:11

标签: php mysql sql

我有一个带有自动递增主键的表,但我现在需要更改它,以便键入连续数字的人不能猜测主键。为了创建随机主键,我想我将创建一个表,其中包含随机顺序混洗的所有6位数字,并且键入1到n。

我的问题是,在不更改所有现有查询的情况下,如何使用自动递增的密钥与第二个表中相应索引处的6位数字之间的链接?

由于只有一个查询要插入此表,我想更改此内容以保持简单。我想查询第二个表中的下一个数字,并将其插入第一个表中的主键列。我认为的问题是两个查询可能同时命中服务器,并可能从第二个表返回相同的6位数。在MySQL中解决这个问题有哪些选择?

3 个答案:

答案 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的可能性。