首页 > 解决方案 > MySQL:生成列的表达式包含不允许的函数?康卡特?

问题描述

我有一个带有虚拟生成列的表,该列使用 CONCAT_WS() 连接其他五个列(int 和 char)。该表包含 200 多条记录并且永远不会更新 - 它只是用作查找表。最近,经过几个月的顺利处理,当我更新子表中的记录时,在该表上执行 SELECT 时,有时会看到此错误(忽略“ITEM UPDATE FAILED” - 那是我):

我每天都有很多变化,所以我无法确定是否存在相关变化。我最近在几个表中添加了“created”和“lastmodified”日期时间字段,其中 CURRENT_TIMESTAMP 用于 DEFAULT 或 ON UPDATE,但没有添加到该表中。

这是表格:

在此处输入图像描述

{EDIT} --- 添加表定义:

 CREATE TABLE `cpct_fixedfield` (
 `id` int(11) UNSIGNED NOT NULL,
 `name` varchar(256) NOT NULL,
 `label` varchar(50) NOT NULL,
 `field` int(11) NOT NULL,
 `start` int(11) NOT NULL,
 `rectype` int(11) NOT NULL ,
 `mediatype` char(1) NOT NULL DEFAULT '' ,
 `length` int(11) NOT NULL,
 `userdefined` tinyint(1) NOT NULL,
 `defaultval` varchar(5) NOT NULL,
 `helpcode` varchar(10) NOT NULL,
 `mandatory` varchar(2) NOT NULL ,
  `idx` varchar(20) GENERATED ALWAYS AS (concat_ws('.',`field`,`rectype`,`mediatype`,`start`,`length`)) VIRTUAL NOT NULL)
 ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

字段中数据的长度永远不会超过 11 个字符。我可以在 pma 或 Mysql Workbench 中查看整个表,并且虚拟字段在所有记录中具体化而没有抱怨,这表明虚拟列的表达式或表达式所依据的列中的数据没有任何问题。

当我更新子表时,该错误发生在多个上下文中。所有更新都发生在存储过程/函数中。似乎触发错误的一段代码是这样的:

SET idxvar = CONCAT_WS(".", SUBSTRING(tmpfldkey,3,1), rectype, ptype, position, "%") COLLATE utf8mb4_general_ci;
SELECT id INTO ffid FROM cpct_fixedfield WHERE idx LIKE idxvar AND idx != "0.0..6.2"; 

所有涉及的变量都是 varchars 或 int。utf8mb4_general_ci 用于整个数据库。

我在 MYSQL 文档中找不到任何对 CONCAT 或 CONCAT_WS 不安全的引用,并且引用的列都没有使用非确定性函数的默认值。由于在虚拟字段或字段的组件中使用了诸如 CURRENT_TIMESTAMP() 之类的非确定性函数,我可以在此论坛和其他地方找到有关此错误的所有其他问题。

我用(大)CASE 语句替换了表上的 SELECT,一切都很好,事实上,在我这样做之后又恢复到 SELECT,我好几个小时都没有错误。但它又发生了(所以我回到案例陈述)。

我的想法已经用完了 - 我希望有人有一些可以提供帮助的知识/经验。

谢谢

标签: mysqlcalculated-columns

解决方案


推荐阅读