mysql - 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,我好几个小时都没有错误。但它又发生了(所以我回到案例陈述)。
我的想法已经用完了 - 我希望有人有一些可以提供帮助的知识/经验。
谢谢
解决方案
推荐阅读
- java - Intellij 将私有字段及其访问器方法移动/重构到不同的类
- node.js - 无法保存 ids 数组 mongo
- elasticsearch - 密集向量数据类型的 Elasticseach 错误,值为空
- c# - 在命令提示符下工作的命令在 C# 中不起作用
- python - 如何通过读取文本文件中提到的日期来计算总天数?
- mysql - 如何从两个表中获取空值 WHERE user_id IS NULL 在 Node.js MYSQL 中不起作用
- python - Django:与多对多关系相关的问题
- javascript - 属性“z”的唯一值
- typescript - 打字稿转换错误以获取输入值
- wpf - WPF 处理文本、图像和文件粘贴事件