0

尝试生成唯一代码以防止重复我使用 HAVING 子句使用以下查询,以便我可以使用别名但我得到重复键错误:

SELECT
  FLOOR(100 + RAND() * 899) AS random_code 
FROM product_codes 
HAVING random_code NOT IN (values) 
LIMIT 1

以下代码不起作用,这是我需要的:

https://stackoverflow.com/a/4382586

有没有更好的方法来实现这一点,或者我的查询有问题?

4

2 回答 2

2

如果您想要保证唯一的唯一代码,请使用 mySQL 函数UUID()

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

“UUID 被设计为在空间和时间上全球唯一的数字。对 UUID() 的两次调用预计会生成两个不同的值,即使这些调用是在两台未相互连接的独立计算机上执行的。”

如果 UUID 太长(例如,它必须恰好是特定数量的数字),则对 UUID 进行散列(例如使用 md5 或 sha-256),获取特定数量的位并将其转换为十进制整数。散列很重要,因为它是保证唯一性的整个 UUID,而不是它的任何一部分。但是,您现在将能够获得哈希冲突,一旦您有超过 sqrt(2^bits) 个条目,这很可能会发生。例如,如果您对 0-1023 使用 10 位,则在大约 32 个条目之后,可能会发生哈希冲突。如果您使用这几位,请考虑使用递增序列。

于 2013-01-24T02:06:44.097 回答
0

想使用 MYSQL 查询来获取 0-999 之间的随机数作为代码,但尝试了该查询,并且我结束了从 0 到 999 填充值条件,但仍然总是得到重复的代码,奇怪的行为,所以我最终使用了 PHP。

我现在使用的步骤:

创建一个填充 0 到 999 的数组,将来如果我需要更多代码将使用 0 到 9999。

$ary_1 = 数组(0, 1, 2, ...., 999)

创建填充了表中所有代码的其他数组。

$ary_2 = 数组(4, 5, 985, 963, 589)

使用 array_diff 获取结果数组。

$ary_3 = array_diff($ary_1, $ary_2)

使用 array_rand 从结果 array_diff 中获取一个数组键。

$new_code_key = array_rand($ary_3, 1)

使用该键获取代码并创建 MYSQL 查询。

$ary_3[$new_code_key]

从新代码数组中取消设置该键,因此我加快了进程,只需要获取另一个 array_rand 键并稍后取消设置。

未设置($ary_3[$new_code_key])

于 2013-01-24T08:24:21.850 回答