DML操作报列不存在?
DML操作报列不存在?
背景概述
客户在测试时发现执行某些DML语句时,出现了异常情况,报表不存在或者列不匹配的情况;
我在做数据迁移测试的时候也出现此问题,迁移数据时报 unknow column;
看到这种情况的时候很奇怪,查看表结构时也能看到当前执行的SQL语句涉及的表及列是存在的;
经过排查,最终发现当前这张表涉及触发器,报错的也不是这张表,而是其他表。
问题复现
本次测试基于 GreatSQL 8.0.32
1.创建测试表
greatsql> CREATE TABLE t1 (c1 int,c2 int,c3 int,c4 int); greatsql> INSERT INTO t1 VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4); greatsql> CREATE TABLE t2 (c5 int,c6 int,c7 int,c8 int); greatsql> INSERT INTO t2 VALUES (1,1,1,1),(2,2,2,2),(3,3,3,3),(4,4,4,4);
2.创建触发器
# t2表不存在c1列 greatsql> CREATE TRIGGER test1 after INSERT on t1 FOR EACH ROW INSERT INTO t2(c1) values(NEW.c1); Query OK, 0 rows affected (0.02 sec) greatsql> CREATE TRIGGER test2 after UPDATE on t1 FOR EACH ROW UPDATE test.t2 SET c1=(NEW.c1)+1 WHERE c1=(NEW.c1); Query OK, 0 rows affected (0.02 sec) greatsql> CREATE TRIGGER test3 after DELETE on t1 FOR EACH ROW DELETE FROM t2 WHERE c1=(OLD.c1); Query OK, 0 rows affected (0.02 sec) # t3表不存在 greatsql> CREATE TRIGGER test4 before UPDATE on t2 FOR EACH ROW INSERT INTO t3(c1) values(NEW.c5); Query OK, 0 rows affected (0.00 sec)
可以看到在创建触发器的时候,不会去判断语句中涉及的表或者列是否存在。
3.执行测试SQL
greatsql> INSERT INTO test.t1 values (1,1,1,1); ERROR 1054 (42S22): Unknown column 'c1' in 'field list' greatsql> UPDATE test.t1 SET c1=110 WHERE c1=1; ERROR 1054 (42S22): Unknown column 'c1' in 'field list' greatsql> DELETE FROM test.t1 WHERE c1=1; ERROR 1054 (42S22): Unknown column 'c1' in 'where clause' greatsql> UPDATE t2 SET c5=110 WHERE c5=1; ERROR 1146 (42S02): Table 'test.t3' doesn't exist
此时报错c1列不存在,但没有显示是具体那张表的c1列,因此对我们产生误导,明明t1表存在c1列,但是还是报错c1列不存在;
4.故障排查
遇到上述问题时,我们可以打开通用日志,观察一下日志中记录的语句
shell> tail -f general5000.log ... 2024-10-14T16:21:16.837007+08:00 2651 Query INSERT INTO test.t1 values (1,1,1,1) 2024-10-14T16:21:16.839500+08:00 2651 Query INSERT INTO t2(c1) values(NEW.c1) ...
可以看到当我们执行了 INSERT INTO test.t1 语句后紧接着自动执行 INSERT INTO t2(c1) 语句,因为t2表没有c1列,所以报错 Unknown column 'c1'。
5.查看当前表涉及的触发器
greatsql> SELECT TRIGGER_SCHEMA,TRIGGER_NAME,EVENT_OBJECT_SCHEMA,EVENT_OBJECT_TABLE,ACTION_STATEMENT FROM INFORMATION_SCHEMA.TRIGGERS WHERE EVENT_OBJECT_TABLE='t1'; +----------------+--------------+---------------------+--------------------+----------------------------------------------------+ | TRIGGER_SCHEMA | TRIGGER_NAME | EVENT_OBJECT_SCHEMA | EVENT_OBJECT_TABLE | ACTION_STATEMENT | +----------------+--------------+---------------------+--------------------+----------------------------------------------------+ | test | test1 | test | t1 | INSERT INTO t2(c1) values(NEW.c1) | | test | test2 | test | t1 | UPDATE test.t2 SET c1=(NEW.c1)+1 WHERE c1=(NEW.c1) | | test | test3 | test | t1 | DELETE FROM t2 WHERE c1=(OLD.c1) | +----------------+--------------+---------------------+--------------------+----------------------------------------------------+ 3 rows in set (0.00 sec)
当出现上面的问题时,可以查看一下这张表是否涉及触发器;如果涉及则检查一下对应触发器的ACTION_STATEMENT字段中的SQL语句涉及的表是否包含报错的字段。
总结
如果出现在执行DML操作时报错,并且报错跟当前表没有什么关系时可以考虑是否有触发器与当前表有关联,检查一下触发器中涉及的SQL语句.
Enjoy GreatSQL :)
关于 GreatSQL
GreatSQL是适用于金融级应用的国内自主开源数据库,具备高性能、高可靠、高易用性、高安全等多个核心特性,可以作为MySQL或Percona Server的可选替换,用于线上生产环境,且完全免费并兼容MySQL或Percona Server。
相关链接: GreatSQL社区 Gitee GitHub Bilibili
GreatSQL社区:
社区有奖建议反馈: https://greatsql.cn/thread-54-1-1.html
社区博客有奖征稿详情: https://greatsql.cn/thread-100-1-1.html
(对文章有疑问或者有独到见解都可以去社区官网提出或分享哦~)
技术交流群:
微信&QQ群:
QQ群:533341697
微信群:添加GreatSQL社区助手(微信号:wanlidbc
)好友,待社区助手拉您进群。

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
《Apache Shiro 源码解析》- 7.会话
7.会话 7.1 Session 的基本概念 7.1.1 什么是 Session 我们都知道,浏览器中的网络通讯功能大多数是基于 HTTP 协议来实现的。 HTTP 协议的第一个版本 v0.9 出现于 1991 年,这是一个非常粗糙的版本,v0.9 对很多机制没有做出明确的定义和描述,后来经过 30 多年的发展才逐步完善起来。以下是 HTTP 协议的演进历程: 版本 引入年份 当前状态 2024 年 8 月的使用率 2024 年 8 月的支持率 HTTP/0.9 1991 废弃 0% 100% HTTP/1.0 1996 废弃 0% 100% HTTP/1.1 1997 标准 33.8% 100% HTTP/2 2015 标准 35.3% 66.2% HTTP/3 2022 标准 30.9% 30.9% (数据来源:wiki) HTTP 被设计成了一种无状态的协议,所谓的无状态,具体的含义是: 每个请求都是独立的:每次浏览器向服务器发送请求时,服务器并不知道之前的请求或之后的请求。这意味着服务器无法记住用户的状态或之前的操作。 没有记忆:服务器不会自动记住用户的历史信息或操作,每次用户...
- 下一篇
LLM 分布式训练六大关键技术介绍
编者按: 本文聚焦于分布式去中心化神经网络训练技术,作者系统阐述了在大规模模型训练中提高硬件使用效率的创新方法。 文章重点阐述了六种关键的分布式训练技术: 数据并行训练:通过将数据 mini-batches 分散到多个 workers,实现并行梯度计算和高效训练。 Butterfly All-Reduce:通过创新的数据分割和汇总方法,有效降低通信成本。 Gossip-Based Averaging:去中心化的通信策略,提高系统的容错性和可扩展性。 Moshpit Gradient Descent:允许 workers 在小型独立组内进行梯度平均,增强训练的容错能力。 DiLoCo:创新的内外优化算法,结合局部和全局参数更新,平衡收敛速度和系统性能。 SWARM:引入动态任务分配和容错机制,优化异构硬件环境下的资源配置。 作者 | Robert Lange 编译 | 岳扬 随着人工智能技术的发展进步,训练大规模神经网络(包括大语言模型)变得越来越重要。这些模型的规模和复杂度不断提升,不仅增加了训练的成本和能耗,也迫切要求我们提高硬件使用效率。为了应对这些挑战,研究人员和工程师们正在探索...
相关文章
文章评论
共有0条评论来说两句吧...
文章二维码
点击排行
推荐阅读
最新文章
- CentOS8安装Docker,最新的服务器搭配容器使用
- Linux系统CentOS6、CentOS7手动修改IP地址
- 2048小游戏-低调大师作品
- Springboot2将连接池hikari替换为druid,体验最强大的数据库连接池
- CentOS8安装MyCat,轻松搞定数据库的读写分离、垂直分库、水平分库
- CentOS8编译安装MySQL8.0.19
- CentOS6,CentOS7官方镜像安装Oracle11G
- CentOS7,8上快速安装Gitea,搭建Git服务器
- SpringBoot2整合Thymeleaf,官方推荐html解决方案
- MySQL8.0.19开启GTID主从同步CentOS8