如何通过MySQL的ALTER与SELECT语句永久展示表中指定数据子集
问题背景
MySQL表testingintern包含TagName、DateTime、Value三个字段,现有样例数据如下:
TagName, DateTime, Value 'SG_QRA_SGTC_0013.PV_Top_Temp', '2022-07-05 11:27:43.7810000', '86.4' 'SG_QRA_SGTC_0013.PV_Bot_Temp', '2022-07-05 11:27:43.7030000', '25.1' 'SG_QRA_SGHAST_0065.PV_HUMIDITY', '2022-07-05 11:27:43.6890000', '85.11' 'SG_QRA_SGHAST_0066.PV_HUMIDITY', '2022-07-05 11:27:43.6890000', '38.48'
需求为永久修改该表,仅保留TagName含Top/Bot、且时间部分为11:27:43的两条数据,目标数据集如下:
TagName, DateTime, Value 'SG_QRA_SGTC_0013.PV_Top_Temp', '2022-07-05 11:27:43.7810000', '86.4' 'SG_QRA_SGTC_0013.PV_Bot_Temp', '2022-07-05 11:27:43.7030000', '25.1'
原语句失效原因
你之前写的SQL存在4个问题:
- 语法错误:
like '%Bot%缺少闭合单引号,语句无法正常执行 - 逻辑优先级错误:SQL中
AND运算优先级高于OR,不加括号的情况下原语句实际逻辑为「匹配所有TagName含Top的数据,或匹配同时满足TagName含Bot+时间符合要求的数据」,筛选范围错误 - 时间匹配错误:
DateTime字段存储值带微秒精度,直接用TIME(DateTime) = '11:27:43'做等值匹配无法命中带小数秒的记录 - 操作类型错误:
SELECT语句仅做查询展示,不会永久修改表内存储的数据
操作步骤
重要提醒:执行删除操作前必须先做查询验证,避免误删数据无法恢复
- 先执行查询语句,确认返回结果完全是你需要保留的数据:
SELECT * FROM testingintern WHERE (TagName LIKE '%Top%' OR TagName LIKE '%Bot%') AND TIME(DateTime) BETWEEN '11:27:43' AND '11:27:43.999999';
这里用时间范围匹配可以兼容微秒精度的时间存储,不会漏掉符合小时分钟秒要求的带小数秒的记录。
- 确认查询结果无误后,执行删除语句永久清理不符合要求的数据:
DELETE FROM testingintern WHERE NOT ( (TagName LIKE '%Top%' OR TagName LIKE '%Bot%') AND TIME(DateTime) BETWEEN '11:27:43' AND '11:27:43.999999' );
执行完成后,表内就仅留存你需要的目标数据了。
如果不需要修改原表,仅需要查询返回目标子集,直接运行第一步的SELECT语句即可。
内容的提问来源于stack exchange,提问作者GQS
相关产品推荐
相关产品推荐

