我可以在 MySQL 中生成的列表达式中使用局部变量吗?

问题描述 投票:0回答:1

我想在 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 mariadb generated-columns
1个回答
0
投票

如您所知,不能在生成的列表达式中使用变量。

您也不能在生成的列表达式中使用用户定义的函数。

原因是变量的值(或函数的定义)可能会在表达式的一次调用与下一次调用之间发生变化。所以这个表达式不是确定性的。

您显示的示例(在表达式中分配变量)可能会覆盖该变量的任何先前定义,但这并不重要。一般情况是涉及变量的表达式可能是不确定的,并且很难确保表达式是安全的。因此 MySQL 实现了生成列来禁止变量。

解决方法是编写一个触发器来计算表达式而不是生成的列。您可以在触发器中使用更多种类的代码,包括使用局部变量。

© www.soinside.com 2019 - 2024. All rights reserved.