由于是测试环境,直接就执行了。
过了一会,测试说数据有误。仔细一看,原来是脚本写错了,导致更新了其他的数据到col1。
针对此脚本做了一下测试,过程见下。
MySQL:5.7.25-log
sql_mode: 空
分析上面的执行结果可知:
可推测出update语句实际执行应该为:update test_table set col1= ('aa' and col2='bb') where id=1
实际结果由 'aa' 与 col2='bb' 进行AND('与') 运算得出。
'与'运算规则:有假则假,即:'aa' 与 col2='bb' 任意一个不为true则结果就为0。
从官档得知既然非0为true,那为什么第三条更新语句结果为0?
update test_table set col1='c' and col2='黄' where id=3
满足 'c' 非0,col2='黄'为true 两个条件。
其实mysql中视非0为true,指非0的数字,如果字符均视为false。
测试如下:
有了上面的结论之后可知,只有最后两个update语句满足同时为真的情形,故最终结果为1,其他均为0。
说了这么多,其实归根结底还是此条update语句语法书写错误导致的问题,正确的写法应该是:
update test_table set col1='xxx',col2='xxx' where id=xxx
同时由于MySQL环境变量sql_mode未设置任何限制,导致只报warnings,未报Errors来终止sql的执行,更新了错误的数据到库表中。
如果把 AND 关键字换成 OR,那运算结果又不一样,'或'运算规则:有真则真。可自行测试。
生产环境执行sql时一定要仔细,做好sql审核,做好备份。
1. 下载 5.7.30 的 zip 包并解压到新的目录。2. 安装 Visual C++ 2012/2013(或更多版本)。
3. 停应用,停止 5.6 实例(可以通过停服务来 *** 作,停止服务前建议记录一下 GTID 或 binlog file 和 position 位置),删除服务。
4. 备份一份 5.6 实例的 datadir,包括 binlog(整个目录 copy 到别的目录存放)。
5. 拷贝 5.6 实例的 datadir 和 my.ini 到 5.7 实例 basedir 目录,调整并优化参数值(注意要确保路径一致,确认已开启 5.7 新特性相关参数,如增强半同步、MTS 等)。
6. 修改系统环境变量,把可执行路径指向 5.7 实例的 basedir/bin。
7. 启动 5.7 实例,创建服务并启动。
8. 验证服务端、客户端版本是否正确。
9. 确认无误后,执行 mysql_upgrade 升级数据字典(会升级系统库:mysql,ps,sys,没有会重建)。
10. 重启实例。
11. 再次校验 5.7 的参数,尽量保持与 5.6 的兼容,尤其要注意 sql_mode 的默认值对业务的影响。
12. 清理 5.6 实例的 basedir 和 datadir 目录(可选)。
13. 如果是主从环境,还要考虑 slave_net_timeout 参数默认值改变带来的影响(主库 error 日志中出现 “ER_RPL_ZOMBIE_ENCOUNTERED” 的报错)。
在 5.7.7 以前,该参数默认是 3600s,之后改为了 60s,需要重新执行 change master to 语句,并且显式指定 master_heartbeat_period=xx,因为从 5.7.4 开始,只有执行 reset slave 才能将其重置为默认值(slave_net_timeout 值的一半)。另外提一句,也是从 5.7.4 开始,执行 change master to 语句时,可以不用先停止复制线程了。
1、首先:创建一个表格,插入数据。
2、查看一下表格插入的所有数据。
3、用update 的命令修改wulianwang2改为wulianwang3看图,这是根据id的位置进行查找的。
4、查看刚刚修改有没有成功,也是用到刚刚的查询语句。
5、其实就是增加了一些修改的条件,刚刚只是修改一个值,现在改为两个值也是可行的,两个值之间都好隔开,其他不变。
6、最后查看修改后的表,就完成了。
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)