惯性聚合 高效追踪和阅读你感兴趣的博客、新闻、科技资讯
阅读原文 在惯性聚合中打开

推荐订阅源

Microsoft Azure Blog
Microsoft Azure Blog
博客园_首页
Forbes - Security
Forbes - Security
WordPress大学
WordPress大学
P
Proofpoint News Feed
T
Threat Research - Cisco Blogs
L
LINUX DO - 热门话题
L
Lohrmann on Cybersecurity
Spread Privacy
Spread Privacy
D
Darknet – Hacking Tools, Hacker News & Cyber Security
大猫的无限游戏
大猫的无限游戏
博客园 - 三生石上(FineUI控件)
P
Privacy International News Feed
A
About on SuperTechFans
T
Tailwind CSS Blog
I
InfoQ
S
Securelist
云风的 BLOG
云风的 BLOG
罗磊的独立博客
Recent Announcements
Recent Announcements
T
The Exploit Database - CXSecurity.com
B
Blog RSS Feed
V
Visual Studio Blog
Know Your Adversary
Know Your Adversary
The GitHub Blog
The GitHub Blog
Jina AI
Jina AI
腾讯CDC
Cyberwarzone
Cyberwarzone
有赞技术团队
有赞技术团队
AWS News Blog
AWS News Blog
博客园 - 【当耐特】
cs.AI updates on arXiv.org
cs.AI updates on arXiv.org
F
Full Disclosure
S
Secure Thoughts
博客园 - 司徒正美
J
Java Code Geeks
Y
Y Combinator Blog
Google Online Security Blog
Google Online Security Blog
GbyAI
GbyAI
N
News and Events Feed by Topic
Help Net Security
Help Net Security
freeCodeCamp Programming Tutorials: Python, JavaScript, Git & More
Project Zero
Project Zero
T
Tenable Blog
cs.CV updates on arXiv.org
cs.CV updates on arXiv.org
T
Tor Project blog
MyScale Blog
MyScale Blog
Scott Helme
Scott Helme
小众软件
小众软件
K
Kaspersky official blog

流动

对口型视频合成方案对比:Wav2Lip、VideoReTalking 与 MuseTalk 2026 音色克隆方案对比:IndexTTS-2、CosyVoice、GPT-SoVITS、Fish Speech、VoxCPM 部署与实测 AI Agent折腾记(OpenClaw / Hermes Agent) 我的2025年 大连之行 回家收麦 六一儿童节爬长城 Golang database/sql 数据库断线自动重连机制解析 Golang默认Http Client导致的cannot assign requested address错误 清明踏春,爬山看海 购入小牛G400T电动车 北京的三月飞雪 wrenAI本地LLM模型部署 天津一日游 2024年终总结 停止使用staticfile.org服务 使用 ImageMagick 自动添加水印,保护图片版权 如何注册一个.sol域名 奥森公园半日游 昌平42公里骑行绿道打卡 十月一日爬慕田峪长城 当Hugo遇上AVIF,优化图片加载 博客被恶意镜像 Github Pages 部署流程解析 搭建个人锻炼页面 你好 Follow 中秋爬山 Google Adsense的审核之旅 让你的IPFS站点持久在线:接入Filebase的Names(IPNS)服务 一次简短的青岛之行 解决 "undeclared name: any (requires version go1.18 or later)" 编译错误 搭建自托管IPFS Gateway服务,替代Cloudflare的IPFS Gateway 302跳转的跨域问题(CORS) GORM增加sqlcommenter特性 源码分析:GORM是如何生成sql的 工银亚洲网银密码重置 加速Cloudflare访问 2023年终总结 2023年12月北京暴雪记录 使用Hugo实现响应式和优化的图片 加速Google Analytics 使用Google Indexing API加速博客收录 在Netlify上部署Twikoo评论系统 利用Github Actions定时抓取微博 北大口腔牙周刮治记录 故乡回忆之旅 解决Golang使用go get安装包后找不到可执行文件的问题 修正Hugo的JSON Feed格式 我的学车之路 将博客部署到星际文件系统(IPFS) 新冠疫情后的第一个春节 第一次清理键盘 2022年终总结 去掉Cloudflare烦人的email-decode.min.js请求 累计布局偏移修复方案改进 —— 自动生成图片宽高 优化博客的累计布局偏移(CLS)问题 将博客部署到Cloudflare Pages 奥林匹克公园向日葵之旅 记第二次洗牙 记录2022年海淀幼升小 Golang解析json的一个问题 疫情下的生活 整理下博客的一些调整 疫情下的五一假期 自己动手,更换thinkpad x1硬盘 二刷百望山 带娃游颐和园 博客架构说明 难得的清明假期 十一年的等待,终于拿到了liudon.com域名 被隔离的一周 mysql中字符串和整型自动转换的问题 如何在北京公积金网站上修改婚姻状况 PHP7.2编译安装后没有php.ini文件的问题 检测网站支持的SSL/TLS协议版本 记一次难忘的手术经历 十一假期经历 Swoft 框架运行分析(五) —— ConsoleProcessor模块分析 Swoft 框架运行分析(四) —— EventProcessor模块分析 一个git submodule update引发的问题 一个Curl的耗时长的问题 Swoft 框架运行分析(三) —— BeanProcessor模块分析 Swoft 框架运行分析(二) —— AnnotationProcessor模块分析 Swoft 框架运行分析(一) BCMath 与 科学计数 Flink Could Not Resolve Resourcemanager Address 解决Sublime Text安装包时"There Are No Packages Available for Installation"的报错 关于本站 2019,新开始
一次惊心动魄的Mysql更新操作
Liudon · 2020-05-19 · via 流动

问题描述

# 表结构
MySQL > desc user_packages;
+----------------+---------------------+------+-----+---------------------+----------------+
| Field          | Type                | Null | Key | Default             | Extra          |
+----------------+---------------------+------+-----+---------------------+----------------+
| up_id          | bigint(20) unsigned | NO   | PRI | NULL                | auto_increment |
| start_date     | date                | NO   |     | NULL                |                |
| end_date       | date                | NO   |     | NULL                |                |
| up_created     | datetime            | NO   | MUL | 0000-00-00 00:00:00 |                |
| up_updated     | datetime            | NO   |     | 0000-00-00 00:00:00 |                |
+----------------+---------------------+------+-----+---------------------+----------------+
5 rows in set (0.00 sec)

MySQL > select * from user_packages limit 5;
+-------+------------+------------+
| up_id | start_date | end_date   |
+-------+------------+------------+
|   185 | 2018-04-01 | 2018-06-30 |
|   186 | 2018-04-01 | 2018-06-30 |
|   187 | 2018-04-01 | 2018-06-30 |
|   188 | 2018-04-01 | 2018-06-30 |
|   189 | 2018-04-01 | 2018-06-30 |
+-------+------------+------------+
5 rows in set (0.00 sec)

操作过程

需要更新某条记录的end_date字段,执行sql如下:

MySQL > update user_packages set end_date = '2020-06-06' and up_id = 189 limit 1;
Query OK, 1 row affected, 1 warning (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 1

执行完,发现sql写错了!!!!

正确的sql应该是:

update user_packages set end_date = '2020-06-06' where up_id = 189 limit 1;

误把where写成了and,还好指定了limit = 1,只操作了一条记录。

回滚

回滚的前提,要先找到更新的那条记录。

up_id为表的主键,更新前表里已经有这条记录了,主键不能重复,感觉语句应该没有执行成功。

MySQL > select * from user_packages where up_id = 189;
+-------+------------+------------+
| up_id | start_date | end_date   |
+-------+------------+------------+
|   189 | 2018-04-01 | 2018-06-30 |
+-------+------------+------------+
1 rows in set (0.00 sec)

执行查询语句,表里确实也只有这一条up_id=189的记录。

感觉这个update语句应该没执行成功,但是没执行成功应该报错的呀。

这个时候把希望放到了语句结果里的Warnings: 1,是不是没执行成功呢。

因为紧接着又执行了其他语句,所以也无法通过show warnings查看具体的错误信息了。

那么这条语句到底执行成功了吗?如果执行成功,那么修改的是哪条记录呢?

这里通过一番查找,终于定位到了记录。

AND分隔符,在mysql语句里优先级最高。

update user_packages set end_date = '2020-06-06' and up_id = 189 limit 1;

等效为

update user_packages set end_date = ('2020-06-06' and up_id = 189) limit 1;


update user_packages set end_date = 0 limit 1;

因为end_date字段为date类型,所以写入表后的记录为0000-00-00

MySQL > select * from user_packages where end_date = '0000-00-00';
+-------+------------+------------+
| up_id | start_date | end_date   |
+-------+------------+------------+
|   185 | 2018-04-01 | 0000-00-00 |
+-------+------------+------------+
1 rows in set (0.00 sec)

好在这次只更新了一条记录,否则后果无法想象。

切记不要在现网直接操作DB。

相关资料:

一个我认为是bug的UPDATE语句