我有一个关于 MySQL 的奇怪问题。特别是存储过程和生成的列。
问题
使用存储过程会引发异常:
Error Code: 3102. Expression of generated column 'unique_name' contains a disallowed function.
但是,如果我运行查询(存储过程调用相同的查询),它就可以正常工作。随后,存储过程正常工作(好吧,无论如何大多数时候)。我的意思是:
在触发这些查询时,表结构没有发生任何更改。
对此的任何帮助、解释和建议将不胜感激。谢谢!
其他详细信息
MySQL版本:5.7.20-0ubuntu0.17.10.1(Ubuntu)
表架构:
有问题的存储过程:
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/