在MySQL中,用update join,里面有order by,会导致MySQL崩溃吗?

作者站长头像
站长
· 阅读数 26

我现在有两个SQL文,第一个可以正常执行,第二个一执行MySQL就崩溃。。崩溃指的是:docker里面对应的那个MySQL容器直接没了,docker ps -a都看不到的那种。

第一个SQL文:
update
    cfg_dev_network_push_status as T1
inner join cfg_dev_network_bind_status as T2 on
    T1.task_id = T2.id
    and T1.del_flag = '0'
    and T1.push_type = '1'
    and T1.push_result != '0'
    and T1.push_retry_times < 3
    and T2.del_flag = '0'
    and T2.dev_id = 'theDevId'
    and T2.status = '1' set
    T1.push_retry_times = T1.push_retry_times + 1,
    T1.push_status = '1',
    T1.push_end_time = '20231010141154002',
    T1.push_result = '1',
    T1.fail_reason = '109'
order by
    T1.id asc
第二个SQL文:
update
    cfg_dev_network_push_status as T1
inner join cfg_dev_network_bind_status as T2 on
    T1.task_id = T2.id
    and T1.del_flag = '0'
    and T1.push_type = '1'
    and T1.push_result != '0'
    and T1.push_retry_times < 3
    and T2.del_flag = '0'
    and T2.dev_id = 'theDevId'
    and T2.status = '1' set
    T1.push_retry_times = T1.push_retry_times + 1,
    T1.push_status = '1',
    T1.push_end_time = '20231010141154002',
    T1.push_result = '1',
    T1.fail_reason = '109'
order by
    T1.push_status desc,
    T1.push_retry_times desc,
    T1.id asc

经测试,第二个SQL文里面,T1.push_status descT1.push_retry_times desc,加任意一个,都会导致MySQL崩溃,只有T1.id asc的时候,是可以正常执行的。push_status的数据类型是char(1),数据里面非0即1。push_retry_times的数据类型是int。

数据库中两个表的数据都在50条左右,不存在内存过大的影响;直接在DBeaver中进行数据查询,不考虑锁的影响。

之后我在服务器中没找到MySQL相关崩溃的日志。。。。

所以,为啥会崩呗,求各路大神帮助~

=================================================================建表文如下所示

-- `lebon-infra-dev`.cfg_dev_network_push_status definition

CREATE TABLE `cfg_dev_network_push_status` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '流水号  | 与id为同一字段,自增数列',
  `task_id` varchar(16) NOT NULL COMMENT '任务ID',
  `push_status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '推送状态(0:待推送/1:已推送/2:已取消)',
  `push_plan_time` char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '预约推送时间(YYYYMMDDHHMMSS)',
  `push_type` char(1) NOT NULL COMMENT '推送种类(1:推送配置项/2:推送优先度/3:推送重启命令)',
  `dev_id` varchar(32) NOT NULL COMMENT '设备ID',
  `config_group_id` varchar(16) NOT NULL COMMENT '配置组ID',
  `config_item_id` varchar(16) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '配置项ID',
  `push_begin_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '推送开始时间(YYYYMMDDHHMMSSFFF)',
  `push_end_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '推送结束时间(YYYYMMDDHHMMSSFFF)',
  `push_duration_s` int NOT NULL DEFAULT '0' COMMENT '推送耗时',
  `push_result` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '推送结果0:成功/1:失败',
  `fail_reason` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '失败原因',
  `push_retry_times` int NOT NULL DEFAULT '0' COMMENT '重试次数',
  `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '删除状态',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本锁',
  `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`),
  UNIQUE KEY `cfg_dev_network_push_status_un` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=149 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='配置-终端网络配置推送状态';

-- `lebon-infra-dev`.cfg_dev_network_bind_status definition

CREATE TABLE `cfg_dev_network_bind_status` (
  `id` bigint NOT NULL AUTO_INCREMENT COMMENT '任务ID | 与id为同一字段,自增数列',
  `dev_id` varchar(32) NOT NULL COMMENT '设备ID',
  `config_group_id` varchar(16) NOT NULL COMMENT '配置组ID',
  `config_group_name` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '配置组名',
  `status` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '状态',
  `push_plan_time` char(14) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '预约推送时间(YYYYMMDDHHMMSS)',
  `push_begin_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '推送开始时间(YYYYMMDDHHMMSSFFF)',
  `push_end_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '推送结束时间(YYYYMMDDHHMMSSFFF)',
  `push_duration_s` int NOT NULL DEFAULT '0' COMMENT '推送耗时',
  `effective_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '实际生效时间(YYYYMMDDHHMMSSFFF)',
  `invalid_time` char(17) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '00000000000000000' COMMENT '实际失效时间(YYYYMMDDHHMMSSFFF)',
  `fail_reason` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '失败原因',
  `cancel_reason` varchar(128) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '取消原因',
  `operator` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '操作者',
  `remark` varchar(256) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '' COMMENT '备注',
  `version` int NOT NULL DEFAULT '0' COMMENT '版本锁',
  `del_flag` char(1) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL DEFAULT '0' COMMENT '删除状态',
  `create_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '创建人',
  `create_time` datetime NOT NULL COMMENT '创建时间',
  `update_by` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '更新人',
  `update_time` datetime DEFAULT NULL COMMENT '更新时间',
  PRIMARY KEY (`id`) USING BTREE,
  UNIQUE KEY `cfg_dev_network_bind_status_un` (`id`) USING BTREE
) ENGINE=InnoDB AUTO_INCREMENT=1070 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='配置-终端网络配置绑定状态';
回复
1个回答
avatar
test
2024-06-26

试了一下,具体问题叫 Incorrect usage of UPDATE and ORDER BY ,意思是update语句如果有join那么是不允许order by的。不过,有点诡异的是你第1条语句居然成功了,我这边试下来你第1、2条语句都会报这个错。如果想先绕过这个问题,当下可以写成:

update
    cfg_dev_network_push_status as T1
set
    T1.push_retry_times = T1.push_retry_times + 1,
    T1.push_status = '1',
    T1.push_end_time = '20231010141154002',
    T1.push_result = '1',
    T1.fail_reason = '109'
where
    T1.del_flag = '0'
    and T1.push_type = '1'
    and T1.push_result != '0'
    and T1.push_retry_times < 3
    and T1.id in (
        select id 
        from cfg_dev_network_bind_status T2 
        where
            T2.del_flag = '0'
            and T2.dev_id = 'theDevId'
            and T2.status = '1' 
    )
order by
    T1.push_status desc,
    T1.push_retry_times desc,
    T1.id asc;

希望能帮助到你。

回复
likes
适合作为回答的
  • 经过验证的有效解决办法
  • 自己的经验指引,对解决问题有帮助
  • 遵循 Markdown 语法排版,代码语义正确
不该作为回答的
  • 询问内容细节或回复楼层
  • 与题目无关的内容
  • “赞”“顶”“同问”“看手册”“解决了没”等毫无意义的内容