我想在 MySQL/MariaDB 中创建一个生成列,如下所示:
ALTER TABLE example ADD uuid uuid AS
(UNHEX(INSERT(
INSERT(@hash:=MD5(username),
13, 2, HEX(CONV(SUBSTR(@hash, 13, 2), 16, 10) & 0x0f | 0x30)),
17, 2, HEX(CONV(SUBSTR(@hash, 17, 2), 16, 10) & 0x3f | 0x80))))
此计算仅取决于
username
字段并且是确定性的,但 MySQL 不允许它作为生成列,因为它使用局部变量。我不想计算哈希三次,因为它浪费资源,所以有没有解决这个问题的方法,如果没有,有人可以解释这个限制的原因吗?
如您所知,不能在生成的列表达式中使用变量。
您也不能在生成的列表达式中使用用户定义的函数。
原因是变量的值(或函数的定义)可能会在表达式的一次调用与下一次调用之间发生变化。所以这个表达式不是确定性的。
您显示的示例(在表达式中分配变量)可能会覆盖该变量的任何先前定义,但这并不重要。一般情况是涉及变量的表达式可能是不确定的,并且很难确保表达式是安全的。因此 MySQL 实现了生成列来禁止变量。
解决方法是编写一个触发器来计算表达式而不是生成的列。您可以在触发器中使用更多种类的代码,包括使用局部变量。