本篇文章持续更新。

  这里说坑,也不算坑,只是对我一个经常用SQL Server的来说有点不习惯而已。

  一、GroupBy 的不同

create table Customer (
CustomerNumber varchar(50),
PayMentDate datetime,
Amount int
)
insert into Customer(
CustomerNumber,
PayMentDate,
Amount
)
select '103','2018-01-02','123.01' union all
select '103','2018-01-08','123.01' union all
select '115','2018-01-04','123.01' union all
select '112','2018-01-05','123.01' union all
select '115','2018-01-08','123.01' union all
select '112','2018-01-10','123.01' union all
select '114','2018-01-06','123.01' ;

  根据上面的数据,我们执行如下SQL语句:

select CustomerNumber,PayMentDate from  Customer group by CustomerNumber

第一反应,看到这条SQL,我说这不是会报错吗(按照以前在SQLServer的逻辑)。

实际上是不会报错的。

虽然大家不推荐这么干,但是上面的写法确实是不会报错的,因为MySQL会给我们(非分组字段)加默认的聚合函数。

真正的原因:MySQL里面是通过sql_Model来提供SQL语句的合法检查,在mysql的sql_model=default的情况下

是允许刚刚上面这种做法的,也就是说一条select语句,除了聚合函数和group by column以外的表达式(这个表达式的值无法确定)

    实际上是MySQL的分组内第一行对应列的值)

  而很多对语义限制比较严的多家数据库,如SQLServer,Oracle,PostgreSql都不支持select trage list 中出现语义不明确的列。

   所以MySQL在后续的版本中出现了一个修正的语义,也就是我们说的ONLY_FULL_GROUP_BY的语义。

set sql_mode=ONLY_FULL_GROUP_BY;
select CustomerNumber,PayMentDate from Customer group by CustomerNumber;

    上面这样写就会报错:说PayMentDate不在Group By 的列中。

  不管我们是否设置:

set sql_mode=ONLY_FULL_GROUP_BY

  我们都应该按照严格的语义来写,不然给后面维护带来不方便。

  二、删除数据

  一开始的删除数据,直接写了下面个子查询,然后就交给DBA,去正式的库执行,之后反馈说,报错了,不能执行。

delete from Customer
where CustomerNumber in (
select CustomerNumber from payments
);

  上面这个做法为什么错呢,因为MySQL不允许在安全模式下,删除数据不通过主键来删除。

  正确的做法:

  把安全更新设置为零,用完再设置回1。

SET SQL_SAFE_UPDATES = 0;
delete from Customer
where CustomerNumber in (
select CustomerNumber from payments
);
SET SQL_SAFE_UPDATES=1;

  从这里也可以看出,我们进行删除数据这些操作,还是尽量的用主键好。主键能够保证不会多删,并且效率也高。

用MySQL碰到的一些“坑”的更多相关文章

  1. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  2. 被mysql中的wait_timeout坑了

    今天被mysql里的wait_timeout坑了         网上能搜到很多关于mysql中的wait_timeout相关的文章,但是大多数只是说明了他的作用,而且都说这个参数要配合那个inter ...

  3. 【踩坑记录】记一次MySQL主从复制延迟的坑

    最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...

  4. Ubuntu 16.04 安装Mysql 5.7 踩坑小记

    title:Ubuntu 16.04 安装Mysql 5.7 踩坑小记 date: 2018.02.03 安装mysql sudo apt-get install mysql-server mysql ...

  5. MySQL字符集的一个坑

    MySQL字符集的一个坑 http://imysql.com/2013/10/29/misunderstand-about-charset-handshake.shtml MySQL字符集的一个坑 1 ...

  6. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  7. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  8. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

  9. 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能

    使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...

随机推荐

  1. golang中值类型的嵌入式字段和指针类型的嵌入式字段

    总结: 1. 值类型的嵌入式字段,该类型拥有值类型的方法集,没有值指针类型的方法集 2. 指针类型的嵌入式字段,该类型拥有值指针类型的方法集,没有值类型的方法集,并且,该类型的指针类型也有值指针类型的 ...

  2. Apple历代Mac系统汇总

    编号 系统名 版本号 名称 发布时间 01 macOS 11.0 Big Sur(大惊喜) 2020年6月 02 macOS 10.15 Catalina(卡特琳娜) 2019年9月 03 macOS ...

  3. Nginx怎么处理请求的?

    nginx接收一个请求后,首先由listen和server_name指令匹配server模块,再匹配server模块里的 location,location就是实际地址.   server { # 第 ...

  4. Linux inode节点使用率过大处理办法

    当发现某个分区下的inode使用率过大时,需要找到该分区下的某些目录里有哪些文件可以清理. 查找某个目录下一个月或两个月之前的文件,然后删除# find . -type f -mtime +30 |w ...

  5. 一起玩转玩转LiteOS组件:TinyFrame

    摘要:TinyFrame是一个简单的用于解析串口(如 UART.telnet.套接字等)通信数据帧的库. 本文分享自华为云社区<LiteOS组件尝鲜-玩转TinyFrame>,作者:Lio ...

  6. Ubuntu18.04 显卡驱动安装(解决各种疑难杂症)

    步骤 下载驱动 准备工作 进行安装 检查安装 下载驱动 首先我们需要去官网下载显卡驱动 打开浏览器,在百度搜索框中搜索:显卡驱动 下载 在手动搜索驱动程序一栏,根据自己的显卡进行选择 产品系列中,No ...

  7. arduino物联网学习

    arduino物联网学习 目录 arduino物联网学习 20200215 OLED屏幕使用教程 材料: 软件 代码注释 完整代码 Arduino IDE 开发 ESP-01S/ESP-01物联网实战 ...

  8. oeasy教您玩转python - 006 - # hello world

    ​ Hello World! 回忆上次内容 python3 的程序是一个 5.3M 的可执行文件 python3 里面全都是 cpu 指令 可以执行的那种指令 我们可以把指令对应的汇编找到 objdu ...

  9. Kubernetes:Pod总结(二)

    Blog:博客园 个人 承接上文. 在实际的生产使用场景中,直接用 Pod 是不合适的,因为必然会产生单点故障.因此,我们需要有一种方法来方便地创建.管理同一个服务的多个实例 Pod.Kubernet ...

  10. 【转】使用Docx.Core创建word表格

    原文地址:https://www.cnblogs.com/qs315/p/13533765.html 使用Docx.Core创建word表格 下载DocxCore Nuget包 当前版本 1.0.7 ...