用MySQL碰到的一些“坑”
本篇文章持续更新。
这里说坑,也不算坑,只是对我一个经常用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碰到的一些“坑”的更多相关文章
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 被mysql中的wait_timeout坑了
今天被mysql里的wait_timeout坑了 网上能搜到很多关于mysql中的wait_timeout相关的文章,但是大多数只是说明了他的作用,而且都说这个参数要配合那个inter ...
- 【踩坑记录】记一次MySQL主从复制延迟的坑
最近开发中遇到的一个MySQL主从延迟的坑,记录并总结,避免再次犯同样的错误. 情景 一个活动信息需要审批,审批之后才能生效.因为之后活动要编辑,编辑后也可能触发审批,审批中展示的是编辑前的活动内容, ...
- 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 ...
- MySQL字符集的一个坑
MySQL字符集的一个坑 http://imysql.com/2013/10/29/misunderstand-about-charset-handshake.shtml MySQL字符集的一个坑 1 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(五)——实现注册功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(四)——对 run.py 的调整
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
- 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(三)——使用Flask-Login库实现登录功能
使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(一)——创建应用 使用 Flask 框架写用户登录功能的Demo时碰到的各种坑(二)——使用蓝图功能进行模块化 使用 Flask 框架写用 ...
随机推荐
- golang中的标准库time
时间类型 time.Time类型表示时间.我们可以通过time.Now()函数获取当前的时间对象,然后获取时间对象的年月日时分秒等信息.示例代码如下: func main() { current := ...
- java-异常-异常捕捉及多catch情况(try-catch)
1 package p1.exception; 2 3 4 /* 5 * 异常处理的捕捉形式: 6 * 这是可以对异常进行针对性处理的方式. 7 * 8 * 具体格式是: 9 * try{ 10 * ...
- 西安腾讯DevOps面试题python算法输出列表数值下界
给定一个列表,然后给一个目标值,列表中两数求和等于目标值,要求输出列表两数的下界 如 list = [1,2,3,4,6,7,8] num=10 #!/usr/bin/python #coding=u ...
- oracle 快速创建用户
create user testdb identified by 123456; grant dba to testdb;
- Spring源码-IOC部分-自定义IOC容器及Bean解析注册【4】
实验环境:spring-framework-5.0.2.jdk8.gradle4.3.1 Spring源码-IOC部分-容器简介[1] Spring源码-IOC部分-容器初始化过程[2] Spring ...
- ApacheCN C# 译文集 20211124 更新
C# 代码整洁指南 零.前言 一.C# 代码标准和原则 二.代码审查--过程和重要性 三.类.对象和数据结构 四.编写整洁的函数 五.异常处理 六.单元测试 七.端到端系统测试 八.线程和并发 九.设 ...
- Redis哨兵模式高可用解决方案
一.序言 Redis高可用有两种模式:哨兵模式和集群模式,本文基于哨兵模式搭建一主两从三哨兵Redis高可用服务. 1.目标与收获 一主两从三哨兵Redis服务,基本能够满足中小型项目的高可用要求,使 ...
- 【JS】函数提升变量提升以及函数声明和函数表达式的区别
今天看js的变量提升问题,里面提到了函数提升.然后发现自己之前一直把函数声明和函数表达式弄错,导致函数提升出错 一.变量提升 console.log(a) var a=100 //undefined ...
- HTML 代码复用
前言 通常我们所做的一些页面,我们可以从设计图里面看出有一些地方是相同的.例如:头部,底部,侧边栏等等.如果是制作静态页面的同学,对于这些重复的部分只能够通过复制粘贴到新的页面来,如果页面的数量上去了 ...
- 【转】Python中自定义可迭代对象
python 中内置的可迭代的对象有 list.tuple.set.dict 等,那么我们自己怎么定义一个可迭代的对象呢?先来段代码吧 import re import reprlib RE_WORD ...