1

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

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

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

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

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

4

2 回答 2

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;
}

(该代码是从这里复制的)。

现在,您没有提供太多关于 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 东西。

于 2013-08-06T20:30:21.640 回答
0

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

于 2013-08-06T20:21:55.863 回答