我试图在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));
感谢您的帮助。
答案 0 :(得分:1)
将UUID()
设置为DEFAULT值将不起作用,因为它不能保证在副本上会生成相同的值。这就是为什么使用TRIGGER是新记录(插入)的好选择的原因。
如果您还打算更新当前记录,则可以编写一条更新语句
update myTable
set UUID = UUID()
您的列的类型为binary(16)
,这意味着UUID数据被隐式转换为二进制。不需要使用UUID_TO_BIN
。
编辑:
CHAR / VARCHAR是人类可读的格式。二进制是紧凑格式。 这意味着将32个字符(带分隔符的36个或更多字符)压缩为16位格式或恢复为可读格式。
如果您不介意阅读UUID,最好使用二进制格式