今天线上项目报错了 500 错误,Laravel 日志中显示

Illuminate/Database/QueryException with message 'SQLSTATE[42S22]:

Column not found: 1054 Unknown column 'is_charge' in 'field list'

(SQL: update `some_categories` set `lft` = case when `lft` >= 29 then `lft`+2 else `lft` end, `rgt` = case when `rgt` >= 29 then `rgt`+2 else `rgt` end where (`lft` >= 29 or `rgt` >= 29))'

即新增层级菜单的时候,更新历史节点的 left right 值报错。

但是,报错很诡异,SQL 语句中并没有 is_charge 出现,但是却一直报

Column not found: 1054 Unknown column 'is_charge' in 'field list'

这个错误很常见,以往都是因为线上数据表表没有同步新增字段,引起字段缺失。但是,完全不相关的 SQL 语句怎么会报出这个错误呢?

排除 Laravel 的问题

为了排除是 Laravel 的三方依赖问题,我直接在 MySQL 命令行中执行测试:

mysql> update some_categories set is_charge = 1 where id = 241;

ERROR 1054 (42S22): Unknown column 'is_charge' in 'field list'

mysql> update some_categories set type = 1 where id = 241;

ERROR 1054 (42S22): Unknown column 'is_charge' in 'field list'

果然,都是同样的错误,这么简单的 SQL 语句都会报错,说明不是单纯的 SQL 拼写错误。

我猜测是这个表有 MySQL 的触发器。

排查 MySQL 的触发器

SELECT * FROM information_schema.TRIGGERS \G;

果然找到了对应的触发器

TRIGGER_CATALOG: def

TRIGGER_SCHEMA: db1

TRIGGER_NAME: some_categories_insert

EVENT_MANIPULATION: INSERT

EVENT_OBJECT_CATALOG: def

EVENT_OBJECT_SCHEMA: db1

EVENT_OBJECT_TABLE: some_categories

ACTION_ORDER: 1

ACTION_CONDITION: NULL

ACTION_STATEMENT: BEGIN INSERT INTO db2.some_categories (id,name,type,link,page_id,page_id,parent_id,lft,rgt,depth,image,created_at,updated_at,is_charge) VALUES (NEW.i$,NEW.name,NEW.type,NEW.link,NEW.page_id,NEW.parent_id,NEW.lft,NEW.rgt,NEW.depth,NEW.image,NEW.created_at,NEW.updated_at,NEW.is_charge);

END

问题很明显了,对应的同步数据库 db2 里的对应表,缺少了 is_charge 字段。确认了一下,确实如此。

问题解决。

参考:https://bugs.mysql.com/bug.php?id=68715

战斗还没有结束

新增字段之后,不报之前的错误了。但是又出现了一个新的错误。

[2019-05-13 22:47:49] production.ERROR: SQLSTATE[21S01]:

Insert value list does not match column list:

1136 Column count doesn't match value count at row 1

(SQL: insert into `some_categories` (`name`, `parent_id`, `lft`, `rgt`, `updated_at`, `created_at`) values (测试测试, 225, 29, 30, 2019-05-13 22:47:49, 2019-05-13 22:47:49))

Column count doesn't match value count 这个错误也很容易理解,就是字段名列表跟值列表个数不匹配。检查了 SQL 没有问题,看来又是触发器的问题了。

在 MySQL 命令行下做了验证,确实如此

mysql> insert into some_categories (name, `type`) values ('test', 1);

ERROR 1136 (21S01): Column count doesn't match value count at row 1

晚上实在太困,到了凌晨,效率更低,愣是没看出触发器那里写错了字段。我决定先睡觉去。。。

今天一早,瞬间发现 page_id,page_id 写了两遍。。。

去掉一个之后,就恢复正常了。

结论

MySQL 排除 SQL 语句问题时,最好在 MySQL 命令行中进行。没有干扰。

触发器确实少用比较好,容易忘掉他的存在

MySQL 的提示确实不够友好。没有注明是触发器中的问题。感觉想尝试其他数据库了。

凌晨排查问题效率太低,不能指望人肉排查

mysql 1054 42s22_MySQL 触发器的坑:ERROR 1054 (42S22): Unknown column 'xxx' in 'field list'相关推荐

  1. mysql出现ERROR 1054 (42S22): Unknown column 'password' in 'field list'如何解决?

    mysql中有一个系统默认的mysql数据库,里边有一个user权限表,在我学习到用户管理的时候使用了如下语句但是系统报错了. select host,user,password from user; ...

  2. Mysql问题 ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘

    问题: 在mysql 5.7版本 修改mysql 用户密码: update mysql.user set password=password('root') where user='root' 提示出 ...

  3. wamp修改数据库默认密码时出现ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘

    wamp3.1修改数据库默认密码时出现ERROR 1054 (42S22): Unknown column 'password' in 'field list' WAMP3.1安装好后,mysql密码 ...

  4. mysql 1054错误 Unknown column 'xxx' in 'field list'

    出现问题的代码如下: s = '测试' sql = "INSERT INTO ffff(ID) VALUES (%s)" % (s) try:cursor.execute(sql) ...

  5. mysql1054错误——(1054, Unknown column 'xxx' in 'field list')

    在使用scrapy框架连接数据库时遇到了1054错误 具体代码如下: try:self.cursor.execute('insert into qiubai(author,content) value ...

  6. Mysql5.7 解决 ERROR 1054 (42S22): Unknown column ‘password‘ in ‘field list‘

    5.7版本与5.6版本的user表的区别 MySQL5.7中mysql.user表比MySQL5.6少了1个字段(Password) MySQL5.7中mysql.user表比MySQL5.6多了3个 ...

  7. mysql 更改root密码字段不存在_初次登陆MySQL修改密码是出现Unknown column 'password' in 'field list'的解决方法...

    新安装的MySQL5.7,登录时提示密码错误,安装的时候并没有更改密码,后来通过免密码登录的方式更改密码,输入update mysql.user  set password=password('roo ...

  8. MySQL使用报错:1054 - Unknown column ‘sno‘ in ‘field list‘(表中字段编码与SQL语句中编码不统一)

    情况描述:在Navicat中新建了一个数据库,然后导入了几个CSV文件,建立了几个表: 其中sno_info结构如下所示: 当我简单查询Sno的时候: 报错了: 1054 - Unknown colu ...

  9. pymysql.err.OperationalError: (1054, “Unknown column ‘xxx‘ in ‘where clause‘“)问题解决方法

    任务 向mysql数据库用户表中加入用户头像图片,一般16M以下的图片类型选择MEDIUMBLOB即可. 遇到问题 用pymysql向mysql插入图片数据时报错:pymysql.err.Operat ...

最新文章

  1. 训练不出结果_智能训练仪:专业化智能防控近视训练设备
  2. 参加UI培训就业多长时间
  3. 使用知乎「好物推荐」功能要注意什么?怎么使用? 关注问题 知乎指南 使用知乎「好物推荐」功能要注意什么?怎么使用?
  4. 地市级地铁数据管理信息系统解决方式
  5. SpringBoot简介、SpringBoot 入门程序搭建、与JDBC、Druid、Mybatis和SpringData JPA的整合
  6. 初识python教案青岛版八年级_青岛版信息技术六上第二单元第8课8.初识python教案...
  7. 增长黑客系列:今天比昨天增长多少?快使用环比函数来分析日志
  8. 【渝粤题库】广东开放大学 建设监理 形成性考核
  9. clientdataset 过滤 in_江门马弗过滤科技有限公司
  10. python学习--关注容易被忽略的知识点--(三)高级特性
  11. 小车手app安卓版下载_美森网校app下载_美森网校安卓版下载[英语培训]
  12. Java基础学习之画板1
  13. html 跑马灯效果 源代码,跑马灯效果.html
  14. CRC校验算法——C语言实现
  15. Eclipse Error Reporting (取消错误报告)
  16. repo sync x509: certificate is valid for,外部过滤器失败,smudge过滤器lfs失败,cannot initialize work tree
  17. java append函数_请详细说一下java中append()的方法.
  18. 【React】React Fiber
  19. matlab plot x y定义,plot是什么意思_matlab中plot(x)的是什么意思?
  20. 计算风险指标:最大回撤、计算风险收益指标:夏普比率、利用最大回撤和夏普比筛选基金、比较3只股票的夏普指数

热门文章

  1. 第3章 别碰白块(《C和C++游戏趣味编程》配套教学视频)
  2. html和ajax通信,使用Ajax与服务器(JSON)通信实例
  3. r语言岭回归参数选择_78-预测分析-R语言实现-岭回归与LASSO回归
  4. android命名管道创建使用
  5. IE和Windows系统中的彩蛋
  6. C++之父Bjarne Stroustrup:程序员在数学上付出的努力,永远也不会白费
  7. 对话MySQL之父:代码一次性完成才是优秀程序员
  8. 2021“科创中国”开源创新榜评选专家评审会在北京成功举办
  9. C 和 C++ 不安全?Android 支持 Rust 开发操作系统
  10. 加速编程效率,你不知道的IDEA功能设置