mysql将唯一的uuid添加到现有表中

时间:2013-08-06 20:01:43

标签: php mysql cakephp qr-code uuid

我有一个主键表是一个自动增量整数。 该表包含现实世界对象的数据。

现在我希望每一行都有一个uuid。我不想更改主键。但我确实希望绝对确定分配的uuid不会被覆盖(所以只在插入时创建UUID,而不是更新)

我想将此uuid用作QR码,因此它需要与主键一样对记录唯一。

任何想法如何做到这一点?

(我正在使用cakePHP2,所以它可能就像创建的时间戳一样。这也只能用原始的INSERT完成)

2 个答案:

答案 0 :(得分:2)

纯蛋糕选项

有很多方法可以做到这一点......

我认为最少的代码入侵是在相应模型的beforeSave中添加一个检查,例如

public function beforeSave() {
    if (!$this->id && !isset($this->data[$this->alias][$this->primaryKey])) {
        // insert
        $this->data[$this->alias]['uuid'] = $this->createUUID();
    } else {
        // edit
        // if you don't want to do anything on insert, delete this "else"
    }
    return true;
}

(该代码是从here复制的。)

现在,你没有提供关于uuid应该是什么的详细信息(整数,长度,可读的单词......)。但是我们假设它是一个简单的整数,如果不是,那么所有的变化都需要在这里完成。在同一模型中,添加一个函数来创建uuid

private function createUUID() {
    do {
        $uuid = rand(); //any logic you want to create the uuid, a md5, substring, hash...
        //check for no repetition
        $help = $this->find('first', array('conditions'=>array('uuid'=>$uuid)));
    } while(!empty($help));
    return $uuid;
}

这样,您将拥有一个唯一的uuid,仅在插入时添加,而不会更改其余代码。 这是我喜欢的解决方案。

现在,另一种方法是,例如,创建一个返回值的UUID函数,并在afterSave中使用它(检查它是插入还是更新)并进行更新使用uuid的记录(到那时你将拥有新创建记录的id)。

一个与另一个没有多大优势...... beforeSave允许你将数据库中的uuid字段设置为NOT NULL,而如果你使用afterSave,则需要首先插入记录,uuid应为null。

没有太多细节,我推荐beforeSave选项,因为我是uuid NOT NULL的东西。

答案 1 :(得分:0)

您可以在表上使用insert trigger来使用mysql UUID()函数设置uuid。您可以使用更新前触发器来阻止更改uuid(即触发器中的NEW.uuid = OLD.uuid)。