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

Posted

技术标签:

【中文标题】mysql将唯一的uuid添加到现有表【英文标题】:mysql add unique uuid to existing table 【发布时间】:2013-08-06 20:01:42 【问题描述】:

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

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

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

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

(我使用的是 cakephp2,所以它可能是类似于创建时间戳的行为。这也只能使用原始 INSERT 完成)

【问题讨论】:

【参考方案1】:

纯蛋糕选择

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

我认为最少的代码侵入性是在相应模型的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)。

两者相比没有太大优势...beforeSaveone 允许您将数据库中的 uuid 字段设置为 NOT NULL,而如果您使用 afterSave,则需要先插入记录,并且 uuid 应该为 null。

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

【讨论】:

谢谢。这是一个很好的答案。更进一步:如何轻松更新表格(即填充新添加的字段)? 你可以用String::uuid()代替rand()book.cakephp.org/2.0/en/core-utility-libraries/… @Costa 是的,当然,这只是一个例子,因为我不知道 uuid 的限制,但很好。 @Jeroen 你可以写一个shell function 基本上调用createUUID() 并编辑每条没有uuid 的记录。它也可以是模型中的函数或动作。如果只是这一次,最简单的选择就可以了,因为您不会在任何其他时间使用它(并且可能在使用后删除)。如果它是经常发生的事情(比如每月一次),请考虑 shell 脚本或控制器操作。 在 beforeSave 的 else 部分做 unset($this->data[$this->alias]['uuid']) 不是更好吗?真正防止意外更新? 当然(如果元素首先存在,请检查 isset 以避免通知)。我发布的不是一个完整的示例,您可以添加您需要的所有验证和功能。我发布了我将要做什么的框架,但细节和其他一切都取决于您认为有用和必要的内容。【参考方案2】:

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

【讨论】:

以上是关于mysql将唯一的uuid添加到现有表的主要内容,如果未能解决你的问题,请参考以下文章

您可以将现有表添加到 MySQL Workbench 中的现有模型吗?

Snowflake SQL:需要将日期脊柱添加到现有表列

如何将外键添加到现有表?

添加唯一约束但忽略现有表数据

如何将包含现有行和新行的新列添加到表中?

Rails迁移以将主键添加到现有表