-3

这是为那些精通 PHP 和 MYSQL 的人准备的。

我正在寻找一种方法来为数据库中的每个条目生成唯一但随机的长编号 ID。

我不希望它从通常的开始,

我想要更长一点的东西。有谁知道任何可以实现这一目标的简单函数或代码片段?

4

5 回答 5

3

您可以更改表的AUTO_INCREMENT种子PRIMARY KEY以获得最初更大的数字。

CREATE TABLE example (
  nid INT NOT NULL PRIMARY KEY AUTO_INCREMENT,
  name VARCHAR(50)
) AUTO_INCREMENT = 200000;

nid向表中插入行时生成的下一个值将是200001

要更改AUTO_INCREMENT现有表的种子,您可以使用:

ALTER TABLE example AUTO_INCREMENT = 200000;
于 2013-04-30T10:27:23.450 回答
2

使用函数 UUID();

你可以阅读更多

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

mysql> SELECT UUID();
    -> '6ccd780c-baba-1026-9564-0040f4311e29'

UUID 是一个 128 位数字,由 5 个十六进制数字的 utf8 字符串表示,格式为 aaaaaaaa-bbbb-cccc-dddd-eeeeeeeeeeee

对于随机数使用 RAND()

SELECT (FLOOR( 1 + RAND( ) *10000 ))
于 2013-04-30T10:28:08.357 回答
0

使用 random.org 生成您的随机数

在 php 中几乎不可能生成真正的随机数。在足够大的样本中,缺陷很明显,因为 PHP 使用伪随机数生成器来生成 rand() 等

http://www.random.org/randomness/

您可以使用 curl 生成和调用随机数。

于 2013-04-30T10:31:53.720 回答
0

是插入还是更新现有表?

假设插入你可以使用这样的东西。

INSERT INTO someTable (aField, aNotherField, SomeNumber)
SELECT 'aFieldValue', 'aNotherField', aNum
FROM (SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum
UNION SELECT ROUND(RAND() * 899999) + 100000 AS aNum) Sub1
LEFT JOIN someTable ON Sub1.aNum = someTable.SomeNumber
WHERE someTable.SomeNumber IS NULL
LIMIT 1

这将生成 100000 和 999999 之间的 10 个随机数,并选择一个尚未使用的随机数。

这是一种非常讨厌的方法,并且有一个明显的主要缺陷,即生成的所有 10 个数字都可能已经被使用。

我倾向于建议可以避免对随机数的需要。

于 2013-04-30T11:28:05.433 回答
-1

这是独一无二的:

$uniqueValue = uniqid('', true)
于 2013-04-30T10:29:16.940 回答