MySQL id列默认使用UUID作为标识符

7

我正在尝试在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));

感谢你的帮助。
2个回答

5

UUID()分配为默认值不起作用,因为它不能保证在副本上生成相同的值。因此,对于新记录(插入),使用TRIGGER是一个不错的选择。

如果您的意图是更新当前记录,您可以编写一个更新语句。

update myTable
set UUID = UUID()

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

编辑后:

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

如果不介意阅读 UUID,则最好使用二进制格式。


嗨Dervis,感谢您的回复。那么您建议我将该列设置为varchar(36)还是binary(16)?其中一个的优势是什么?谢谢。 - mkaric
1
您可以将列设置为 CHAR(36),因为它始终具有相同的长度。 - Dark Knight
CHAR/VARCHAR是人类可读的格式,而二进制是紧凑的格式。如果您不介意阅读UUID,则最好使用二进制格式。 - Derviş Kayımbaşıoğlu

1

将VARCHAR更改为CHAR,这样您就可以使用16位。

旧方法

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

新方法

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

1
为什么“新方法”要使用BINARY(36)?据我所知,BINARY(16)对于UUID应该已经足够了。除了大小不同之外,这正是问题中包含的内容,因此我不明白这将如何回答问题。另外,“16位”可能不正确,也许你是指“16字节”? - Robert
2
我使用两种方法都遇到了错误。 - RawSlugs

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接