UUID 作为 MySQL id 列的默认值

Posted

技术标签:

【中文标题】UUID 作为 MySQL id 列的默认值【英文标题】:UUID as default for MySQL id column 【发布时间】:2020-09-22 05:56:15 【问题描述】:

我正在尝试向 mysql 8.0.17 中的现有表添加一列。该列需要包含 UUID,我正在尝试将其设置为默认值。

这是我正在执行的语句

ALTER TABLE myTable ADD COLUMN UUID varchar(36) NOT NULL DEFAULT (UUID());

但是我收到以下错误

错误代码:1674。语句不安全,因为它使用的系统函数可能会在从站上返回不同的值。

我从其他帖子中读到可以在表上创建触发器,但是我想知道是否可以直接将其设置为列上的默认值。

另外,与简单的 UUID 相比,使用 UUID 的二进制转换有什么优势?

例如。

ALTER TABLE myTable ADD COLUMN UUID binary(16) NOT NULL DEFAULT (UUID_TO_BIN(UUID(), true));

感谢您的帮助。

【问题讨论】:

【参考方案1】:

UUID() 分配为默认值将不起作用,因为它不能保证在您的副本上生成相同的值。这就是为什么使用 TRIGGER 是新记录(插入)的好选择。

如果您也打算更新当前记录,您可以编写更新语句

update myTable
set UUID = UUID()

您的列是 binary(16) 类型,这意味着 UUID 数据被隐式转换为二进制。不需要使用UUID_TO_BIN

编辑:

CHAR/VARCHAR 是人类可读的格式。而二进制是紧凑格式。 这意味着将 32 个字符(带分隔符的 36 个或更多)压缩为 16 位格式或恢复为人类可读的格式。

如果你不介意读取 UUID,最好是使用二进制格式

【讨论】:

您好,Dervis,感谢您的回复。那么你建议我将列设置为 varchar(36) 还是 binary(16) ?一个比另一个有什么优势?谢谢。 您可以将列设置为CHAR(36),因为它的长度始终相同。 CHAR/VARCHAR 是人类可读的格式。而二进制是紧凑格式。如果你不介意读取 UUID,最好使用二进制格式

以上是关于UUID 作为 MySQL id 列的默认值的主要内容,如果未能解决你的问题,请参考以下文章

Django 2.2 + UUID 作为 ID + 默认值

OC怎么使用MYSQL 或者swift怎么使用MYSQL

在 laravel 迁移中使用 UUID 作为默认值

mysql里的表怎么改列的默认值

如何在 Postgres 中为 UUID 主键列设置默认值?

如何更改 mysql 表列的默认值?