如何在生成的列中使用函数?

时间:2017-11-01 03:15:52

标签: mysql

我正在使用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'

1 个答案:

答案 0 :(得分:1)

https://dev.mysql.com/doc/refman/5.7/en/create-table-generated-columns.html - 生成的列表达式必须符合以下规则。如果表达式包含不允许的构造,则会发生错误。

允许文字,确定性内置函数和运算符。 不允许使用子查询,参数,变量,存储函数和用户定义函数