为MySQL唯一字段生成唯一值

时间:2015-02-03 09:34:13

标签: php mysql unique

例如,当用户注册我的网站时,我会创建一个长度为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字段具有唯一属性,我需要知道插入这些键时不会发生任何唯一违规。

5 个答案:

答案 0 :(得分:3)

好的,基本上你有两种方法。

  1. 让DB处理此问题并使用 UUID()创建可在电子邮件中使用的唯一标识符。

    根据您的MySQL版本,您有一些选择:

    A。使用 MySQL 4.1 及更高版本,您可以直接在INSERT INTO中使用该功能:

    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()
    
  2. 您可以以编程方式检查生成的ID是否真的唯一。您现在正在做同样的事情,但您可以稍微重构一下代码:

    $key = generate_hash(40);
    while ( count($model->get_by_key($key)) ) {
        $key = generate_hash(40);
    }
    
    //here you have an unique id in $key 
    

答案 1 :(得分:0)

几乎每种语言都有内置的唯一id函数。在php中,

echo uniqid();

答案 2 :(得分:0)

您可以生成256 ^ 40个不同的40个字符的字符串。 在生成2个相同的字符串之前,Sun会爆炸。

答案 3 :(得分:0)

您可以使用md5(time())作为您的唯一值。每个用户提交的md5 time都不相同。

$time = time();
$md5 = md5($time);

只要md5()只包含32个字符串长度,您就可以在md5()之后添加一个唯一字词。

$unique = $md5."uniq1234";

现在你有40个唯一的字符串长度。最后,您可以在数据库中添加$unique作为您的唯一值

答案 4 :(得分:-1)

您可以使用此功能生成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);