我正在使用MYSQL 5.7,而且我无法访问8.0中引入的方法。
因此,我想做这样的事情:
CREATE FUNCTION uuid_to_bin(uuid CHAR(36))
RETURNS BINARY(16) DETERMINISTIC
RETURN concat(
substr(unhex(replace(uuid, '-', '')), 7, 2),
substr(unhex(replace(uuid, '-', '')), 5, 2),
substr(unhex(replace(uuid, '-', '')), 1, 4),
substr(unhex(replace(uuid, '-', '')), 9, 8));
CREATE TABLE `example` (
`id` BINARY(16) GENERATED ALWAYS AS (uuid_to_bin(document->>'$.id')) STORED NOT NULL,
`document` JSON NOT NULL,
PRIMARY KEY (`id`)
)
ENGINE = InnoDB
DEFAULT CHARSET = utf8
COLLATE = utf8_bin;
然而,当我运行给定的sql时,它会抛出一个错误:
[2017-11-01 14:12:41] [HY000][3102] Expression of generated column 'id' contains a disallowed function.
甚至认为该功能确定性。我怎么能这样做?
我调用了我的函数uuid_to_bin
,因为如果将来我能够将我的MYSQL服务器升级到8.0,我不想更改我的列的SQL
也许这是一个原因? COLLATION 'utf8_bin' is not valid for CHARACTER SET 'binary'
答案 0 :(得分:1)
https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html - 生成的列表达式必须符合以下规则。如果表达式包含不允许的构造,则会发生错误。
允许文字,确定性内置函数和运算符。 不允许使用子查询,参数,变量,存储函数和用户定义函数。