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

标签 mysql stored-procedures

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

问题

使用存储过程会引发异常:

Error Code: 3102. Expression of generated column 'unique_name' contains a disallowed function.

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

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`),' ','_')

最佳答案

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

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 ;

现在看来一切正常。我最好的猜测是生成的列与时间戳不能很好地配合。任何对我的方法的正确性的见解/反馈仍然将不胜感激。干杯:)

关于MySQL:生成列的表达式包含不允许的函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47686884/

相关文章:

如果需要的话,MySQL 存储过程要 INSERT DELAYED 但先 CREATE TABLE 吗?

mysql - 带有 MySQL 存储过程的动态 IN 语句

mysql - 计算总行和真实条件行

php - 使用mysql从三个不同的表中呈现php中的数据

mysql - matlab数据库与mysql数据库连接失败

MySQL - 如果最后一条记录高于前一条记录,则继续获取记录

mysql - 根据mysql中的两列选择唯一行

php - 在不迁移的情况下向 Eloquent 模型添加一列 -PHP

java - JPA StoredProcedureQuery 从参数开始得到错误的值

MYSQL存储过程更新变量为0