1

我有一个带有自动递增主键的表,但我现在需要更改它,这样主键就不会被输入连续数字的人猜到。为了创建随机主键,我想我将创建一个包含所有 6 位数字的表,这些数字按随机顺序排列,并以 1 到 n 为键。

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

由于只有一个查询要插入到该表中,我想更改它以使事情变得简单。我想查询第二个表中的下一个数字并将其插入到第一个表的主键列中。我预见的问题是两个查询可能同时访问服务器,并可能从第二个表返回相同的 6 位数字。在 MySQL 中解决这个问题有哪些选择?

4

3 回答 3

1

Thanks for the suggestions, but no one actually answered my question as it stands.

My table of pins looks like:

id |  pin   | used
 1   123456    1
 2   258464    0
 3   842364    0

And I use the query to get the next pin:

SELECT id, pin FROM game_pins WHERE used = '0' ORDER BY id LIMIT 1;

And then I update that row to SET used = '1'.

To prevent two people getting the same pin I use InnoDB transactions, which in CodeIgniter I've done by wrapping everything in:

$this->db->trans_start();

...

$this->db->trans_complete();
于 2013-10-14T15:16:20.957 回答
1

与其做所有这些,为什么不使用 UUID?您可以修改您的表格,将这种类型的列添加到您的表格中,您无需担心生成任何内容或跟踪它。

https://dev.mysql.com/doc/refman/5.0/en/miscellaneous-functions.html#function_uuid

于 2013-10-11T15:51:19.453 回答
0

丢弃这个额外的表,只使用rand()生成 100000 到 999999 之间的随机数。选择这个随机数,直到你发现未使用。看起来您不需要经常这样做,因此不必非常快。但是查询会更快,因为不需要额外的连接。

但请记住,它并不比简单的自动增量更安全——用户可以在几个小时内尝试所有 900k 的可能性。

于 2013-10-11T16:35:56.510 回答