为 MySQL 个唯一字段生成唯一值
Generating Unique Values for MySQL Unique Fields
例如,当用户注册我的网站时,我会创建一个长度为 40 的唯一字符串并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中包含 URL 形式的唯一字符串,一切正常。
但是,如何创建和插入此注册实体以确保具有唯一 属性 的字段实际上是唯一的?
我目前的做法是:
$key = '';
$repeat = true;
while ($repeat) {
$key = generate_hash(40);
$is_unique = (count($model->get_by_key($key)) === 0) ? true : false;
$repeat = ($is_unique) ? false : true;
}
// At this point I know the key is unique and can insert it...
我对这段代码不满意,因为我通常尽量避免 while 循环。有没有更好的方法来实现我在这里做的事情?
底线是包含这些键的 MySQL 字段具有唯一性 属性 并且我需要知道插入这些键时不会发生唯一性违规。
that.In php,
几乎每种语言都内置了唯一的 id 函数
echo uniqid();
您可以使用此函数生成 uniqueID ,
function keygen($length=10)
{
$key = '';
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));
$inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));
for($i=0; $i<$length; $i++)
{
$key .= $inputs{mt_rand(0,61)};
}
return $key;
}
echo keygen(10);
您可以生成 256^40 个不同的 40 个字符的字符串。
Sun 会在你生成 2 个相同的字符串之前爆炸。
您可以使用 md5(time())
作为您的唯一值。 md5
of time
对于每个提交的用户来说都不相同。
$time = time();
$md5 = md5($time);
只要md5()
刚好包含32个字符串长度,就可以在md5()
后加一个唯一的词。
$unique = $md5."uniq1234";
现在你有 40 个独特的字符串长度。最后,您可以将 $unique
添加为数据库中的唯一值
好的,基本上你有两种方法。
让数据库处理这个并使用 UUID() 创建一个您可以在电子邮件中使用的唯一标识符。
根据您的 MySQL 版本,您有一些选择:
A. 对于 MySQL 4.1 及更高版本,您可以直接通过 INSERT INTO:[=13= 使用该函数]
INSERT INTO table_name
(unique_id, field1, field2)
VALUES
(UUID(), "smth", "smth")
B. 使用 MySQL 5.0 您可以创建一个 TRIGGER 并在插入时自动填充唯一字段:
CREATE TRIGGER
unique_id
BEFORE INSERT ON
table_name
FOR EACH ROW
SET NEW.unique_id = UUID()
您可以通过编程方式检查生成的 ID 是否真的是唯一的。您现在所做的相同,但您可以像这样重构代码:
$key = generate_hash(40);
while ( count($model->get_by_key($key)) ) {
$key = generate_hash(40);
}
//here you have an unique id in $key
例如,当用户注册我的网站时,我会创建一个长度为 40 的唯一字符串并将其插入数据库。然后,我们向新注册的用户发送一封电子邮件,其中包含 URL 形式的唯一字符串,一切正常。 但是,如何创建和插入此注册实体以确保具有唯一 属性 的字段实际上是唯一的?
我目前的做法是:
$key = '';
$repeat = true;
while ($repeat) {
$key = generate_hash(40);
$is_unique = (count($model->get_by_key($key)) === 0) ? true : false;
$repeat = ($is_unique) ? false : true;
}
// At this point I know the key is unique and can insert it...
我对这段代码不满意,因为我通常尽量避免 while 循环。有没有更好的方法来实现我在这里做的事情?
底线是包含这些键的 MySQL 字段具有唯一性 属性 并且我需要知道插入这些键时不会发生唯一性违规。
that.In php,
几乎每种语言都内置了唯一的 id 函数echo uniqid();
您可以使用此函数生成 uniqueID ,
function keygen($length=10)
{
$key = '';
list($usec, $sec) = explode(' ', microtime());
mt_srand((float) $sec + ((float) $usec * 100000));
$inputs = array_merge(range('z','a'),range(0,9),range('A','Z'));
for($i=0; $i<$length; $i++)
{
$key .= $inputs{mt_rand(0,61)};
}
return $key;
}
echo keygen(10);
您可以生成 256^40 个不同的 40 个字符的字符串。 Sun 会在你生成 2 个相同的字符串之前爆炸。
您可以使用 md5(time())
作为您的唯一值。 md5
of time
对于每个提交的用户来说都不相同。
$time = time();
$md5 = md5($time);
只要md5()
刚好包含32个字符串长度,就可以在md5()
后加一个唯一的词。
$unique = $md5."uniq1234";
现在你有 40 个独特的字符串长度。最后,您可以将 $unique
添加为数据库中的唯一值
好的,基本上你有两种方法。
让数据库处理这个并使用 UUID() 创建一个您可以在电子邮件中使用的唯一标识符。
根据您的 MySQL 版本,您有一些选择:
A. 对于 MySQL 4.1 及更高版本,您可以直接通过 INSERT INTO:[=13= 使用该函数]
INSERT INTO table_name (unique_id, field1, field2) VALUES (UUID(), "smth", "smth")
B. 使用 MySQL 5.0 您可以创建一个 TRIGGER 并在插入时自动填充唯一字段:
CREATE TRIGGER unique_id BEFORE INSERT ON table_name FOR EACH ROW SET NEW.unique_id = UUID()
您可以通过编程方式检查生成的 ID 是否真的是唯一的。您现在所做的相同,但您可以像这样重构代码:
$key = generate_hash(40); while ( count($model->get_by_key($key)) ) { $key = generate_hash(40); } //here you have an unique id in $key