MySQL:生成列的表达式包含不允许的函数

时间:2017-12-07 02:58:39

标签: mysql stored-procedures

我对MySQL有一个奇怪的问题。特别是存储过程和生成的列。

问题

使用存储过程会抛出异常:

  

错误代码:3102。生成的列的表达式" unique_name'包含不允许的功能。

但是,如果我运行查询(存储过程调用相同的查询),它工作正常。随后,存储过程正常工作(好吧,无论如何大部分时间)。我的意思是:

mysql output

在触发这些查询时,表结构没有任何更改。

对此的任何帮助,解释和建议都将非常感激。谢谢!

其他详细信息

MySQL版本:5.7.20-0ubuntu0.17.10.1 (Ubuntu)

表架构:

Table schema

有问题的存储过程:

DELIMITER //
CREATE PROCEDURE createPost
(IN author INT(11), IN title CHAR(100), IN content LONGTEXT)
BEGIN
    INSERT INTO `blog`.`posts` (`author`, `title`, `content`) VALUES (author, title, content); 
    SELECT last_insert_id() as last_insert_id;
END //
DELIMITER ;

我如何称呼它:

CALL createPost('1','223','12');

生成列的表达式(unique_name):

replace(concat(`title`,'-',`date_time`),' ','_')

1 个答案:

答案 0 :(得分:1)

未能使生成的列工作,我决定解决它。将unique_name列更改为非生成列(原型设计阶段,因此删除表是一个选项),我决定创建该条目,然后在存储过程中更新它,如下所示:

DELIMITER //
CREATE PROCEDURE createPost
(IN author INT(11), IN title CHAR(100), IN content LONGTEXT)
BEGIN
    INSERT INTO `blog`.`posts` (`author`, `title`, `content`) VALUES (author, title, content);
    UPDATE `blog`.`posts`
    SET `posts`.`unique_name` = replace(concat(`title`,'-',SUBSTR(UUID(),1,8)),' ','_')
    WHERE `posts`.`post_id` = last_insert_id();
    SELECT last_insert_id() as last_insert_id;
END //
DELIMITER ;

现在似乎工作正常。我最好的猜测是生成的列与时间戳不能很好地匹配。对我的方法的正确性的任何见解/反馈仍然会受到赞赏。干杯:)