mysql - UUID 作为 MySQL id 列的默认值
问题描述
我正在尝试向 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));
谢谢你的帮助。
解决方案
分配UUID()
为 DEFAULT 值将不起作用,因为它不能保证在您的副本上生成相同的值。这就是为什么使用 TRIGGER 是新记录(插入)的好选择。
如果您还打算更新当前记录,则可以编写更新语句
update myTable
set UUID = UUID()
您的列是类型 binary(16)
,这意味着 UUID 数据被隐式转换为二进制。UUID_TO_BIN
不需要使用。
编辑:
CHAR/VARCHAR 是人类可读的格式。而二进制是紧凑格式。这意味着将 32 个字符(带分隔符的 36 个或更多字符)压缩为 16 位格式或恢复为人类可读的格式。
如果您不介意阅读 UUID,最好使用二进制格式
推荐阅读
- oauth - 如何使用 openssl 解密 oauth 签名(使用 ec256 加密的 digist)
- python - 在 SQLAlchemy 中,按降序获取数据或 reverse() 列出获取的数据哪个更好?
- git - 使用 GitHub 操作将拉取请求合并到主服务器时,使用什么可预测的提交 sha?
- javascript - 如何使用 javascript 更改 svg 文件的属性?
- c# - cmd.executescalar() 有效但抛出 ORA-25191 异常
- ruby-on-rails - 在 rails 中设置全局参数在 rails 中无法正常工作
- python - DRF API 中文本/纯文本请求的数据格式
- flutter - 在 Android 设备上运行时构建的应用程序不起作用
- blazor - Blazor WebAssembly 生产秘密最佳实践?
- json - 如何发布非常大的json数据