首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >MySQL实际应用的两个案例

MySQL实际应用的两个案例

作者头像
AsiaYe
发布于 2019-11-06 09:16:32
发布于 2019-11-06 09:16:32
1.3K00
代码可运行
举报
文章被收录于专栏:DBA随笔DBA随笔
运行总次数:0
代码可运行

01

alter table引发的一个问题

今天早晨,有个业务方提了个需求,是需要把一个表里的字段从date格式直接变成int格式,目的是为了去掉日期格式中间的短横线,类似2019-09-01变成20190901,也就是需要使用alter table的方法修改字段,这种操作一般在线上是不支持的,一般情况下,只有从tinyint改成int,或者从int改成unsigned int这种类型的转换,才会在线上的表做,这种跨类型的,一般不建议直接修改。

我首先询问了一下他表里面的数据量,得到的反馈是这个表是个配置表,数据量就30来条,这我就很放心了,这么小的数据量,即使出了问题,那么恢复起来也比较容易,为了以防万一,我现在测试环境上做了个测试:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql@127.0.0.1:yeyztest 10:47:18>>create table test14 (id int primary key,count_date date);   
Query OK, 0 rows affected (0.08 sec)

mysql@127.0.0.1:yeyztest 10:47:50>>insert into test14 values (1,'2019-09-28');
Query OK, 1 row affected (0.01 sec)

mysql@127.0.0.1:yeyztest 10:48:28>>select * from test14;
+----+------------+
| id | count_date |
+----+------------+
|  1 | 2019-09-28 |
+----+------------+
1 row in set (0.00 sec)

mysql@127.0.0.1:yeyztest 10:48:34>>alter table test14 modify count_date int ;
Query OK, 1 row affected (0.02 sec)
Records: 1  Duplicates: 0  Warnings: 0

mysql@127.0.0.1:yeyztest 10:48:58>>select *from test14;
+----+------------+
| id | count_date |
+----+------------+
|  1 |   20190928 |
+----+------------+
1 row in set (0.00 sec)

创建了一个test14的表,里面包含两个字段,一个是id,一个是count_date,其中id是int类型的,count_date是date类型的,然后直接进行了一个alter表的修改操作,发现结果和预期的一致。这样就放心了,然后在线上的环境也操作了一下,结果傻眼了。。。

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
mysql@127.0.0.1 10:50:20>>select * from XXXX;          
+----+------------+------------+----------+----------+----------+---------+---------+---------+
| id | count_date | count_type | count1   | count2   | count3   | count4  | count5  | count6  |
+----+------------+------------+----------+----------+----------+---------+---------+---------+
| 11 | 2019-09-28 |          1 |  2906.00 |  2123.00 |  1675.00 | 1347.00 | 1144.00 |  984.00 |
| 12 | 2019-09-28 |          2 |     0.83 |     0.81 |     0.65 |    0.61 |    0.54 |    0.36 |
| 13 | 2019-09-26 |          1 |  2532.00 |  1623.00 |  1245.00 |  942.00 |  789.00 |  681.00 |
----------------------
| 42 | 2019-10-09 |          2 |     0.97 |     0.98 |     0.94 |    0.85 |    0.62 |    0.35 |
+----+------------+------------+----------+----------+----------+---------+---------+---------+
32 rows in set (0.00 sec)

mysql@127.0.0.1 10:50:35>>alter table XXXX modify count_date int;
Query OK, 32 rows affected, 32 warnings (0.11 sec)
Records: 32  Duplicates: 0  Warnings: 32

mysql@127.0.0.1  11:04:42>>select * from XXXX ;                       
+----+------------+------------+----------+----------+----------+---------+---------+---------+
| id | count_date | count_type | count1   | count2   | count3   | count4  | count5  | count6  |
+----+------------+------------+----------+----------+----------+---------+---------+---------+
| 11 |       2019 |          1 |  2906.00 |  2123.00 |  1675.00 | 1347.00 | 1144.00 |  984.00 |
| 12 |       2019 |          2 |     0.83 |     0.81 |     0.65 |    0.61 |    0.54 |    0.36 |
| 13 |       2019 |          1 |  2532.00 |  1623.00 |  1245.00 |  942.00 |  789.00 |  681.00 |
| 14 |       2019 |          2 |     0.85 |     0.84 |     0.74 |    0.69 |    0.57 |    0.34 |
| 15 |       2019 |          1 |  2494.00 |  1610.00 |  1248.00 |  945.00 |  786.00 |  669.00 |
| 16 |       2019 |          2 |     0.85 |     0.82 |     0.69 |    0.68 |    0.54 |    0.35 |
| 17 |       2019 |          1 |  2424.00 |  1515.00 |  1129.00 |  873.00 |  709.00 |  605.00 |
| 18 |       2019 |          2 |     0.84 |     0.84 |     0.74 |    0.72 |    0.60 |    0.41 |
| 19 |       2019 |          1 |    88.00 |    60.00 |    40.00 |   30.00 |   23.00 |   20.00 |
| 20 |       2019 |          2 |     0.84 |     0.82 |     0.65 |    0.43 |    0.48 |    0.30 |
| 21 |       2019 |          1 | 31332.00 | 17783.00 | 12596.00 | 9692.00 | 8311.00 | 7181.00 |
| 22 |       2019 |          2 |     0.84 |     0.84 |     0.77 |    0.92 |    0.72 |    0.36 |
| 23 |       2019 |          1 | 28173.00 | 16656.00 | 12052.00 | 9262.00 | 7722.00 | 6472.00 |
| 24 |       2019 |          2 |     0.95 |     0.95 |     0.91 |    0.85 |    0.61 |    0.34 |

第二列直接全部变成2019了,这下坏了,直接给截断了,这到底是为什么?来不及想了,先回复数据吧,因为只有30来条数据,就直接拼SQL的方法给恢复了。

后面静下心来想这个问题,为什么测试环境和线上环境的结果不一样呢?详细查看了一番之后,发现问题出在了数据库的版本上,线上的版本是老版本5.5.19,而测试环境是5.7.16,这样问题就明确了,在5.7.16上面,直接变更字段从date类型到int类型,则会去掉date类型的短横线,而在5.5.19版本上,如果进行变更,则会发生截断。

这让我想起了上个礼拜听一个报告的时候,一位行业内老师说的一句话:永远选择最好的机器,用最新的数据库版本,这样能解决你很大一部分问题。确实是,旧的版本还是有些问题处理的不到位,所以才会被迭代。

通过这个事情,有以下几个小收获吧,第一,在线上操作之前,需要现在测试环境搞一把,确认无误之后再进行操作,第二,任何操作之前,都要想到回滚方案,出故障没法解决的操作,我劝大家还是不要做。

02

关于distinct和order by 的一个问题

之前讲过关于MySQL5.7版本的一些参数,其中包含了sql_mode,这个参数是控制MySQL服务的SQL运行模式,5.7版本的模式更为严格,SQL mode参数里面包含大约7个项,今天我遇到的问题主要是关于only_full_group_by相关的,这个参数,说白了就是一个SQL,select出来的字段中需要包含group by出来的字段,关于这个问题,之前的6月27日的文章中有说到过。

今天遇到的问题是,一个业务方写了一个sql,类似于select distinct a,b from table order by c;

然后一直报错,内容是Expression #1 of ORDER BY clause is not in select list.也就是说,order by的字段c不在select的字段a和b当中,然而,去掉了这个SQL中的distinct之后,这个SQL执行起来就没有错误了。

一开始,对于这个错误,我还没有想明白为什么,后面举了个例子想了想,确实是不应该这样。为了方便理解,我写个例子:

代码语言:javascript
代码运行次数:0
运行
AI代码解释
复制
-----------
|A   B   C|
-----------
|1   2   3|
-----------
|2   2   4|
-----------
|1   2   5|
-----------

例如这样的一个表,其中a b c为这个表的三个字段,上面的SQL:

select distinct a,b from table order by c;

首先要对a b这个组合去重,我们可以看到,这个组合中,a=1,b=2的记录有两条,而这两条记录的c值是不一样的,那么到底用哪一条记录呢?

如果使用第一条记录c=3,那么按照c字段进行order by 的时候,a=1,b=2的记录就排在a=2,b=2的记录前面;

如果使用第二条记录c=5,那么按照c字段进行order by 的时候,a=1,b=2的记录就排在a=2,b=2的记录后面;

使用不同的记录会产生不同的排序结果,那么MySQL怎么知道使用哪一条记录呢?答案是蒙圈了。所以这种SQL就是不被允许的,如果去掉了distinct,那么这样的SQL其实是没有歧义的,也就被允许了。

今天这两个小案例虽然看起来不起眼,但是在实际应用中,还是需要多注意,否则很容易出现问题,今天就到这里吧。

本文参与 腾讯云自媒体同步曝光计划,分享自微信公众号。
原始发表:2019-10-10,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 DBA随笔 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体同步曝光计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
暂无评论
推荐阅读
【DEDE[sql执行]】DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
DEDE织梦cms常用的参数标签汇总、以及操作过程中的一些bug问题解决方法,dede网站二开,以下龙腾飞网络科技-小吴在建站实操中笔记记录,织梦dede建站教程保存使用非常方便:
攻城狮与产品喵
2025/03/13
5390
【DEDE[sql执行]】DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
执行织梦SQL语句更改网站文章id从1开始
如何让网站文章ID从1开始,其实操作起来很简单,这里面涉及到三张表dede_arctiny(微表),dede_archives(主表),dede_addonarticle(副表)
米米素材网
2022/06/20
1.2K0
dedecms批量替换sql写法
相信对于很多织梦dedecms站长来说,应该经常遇到采集文章或者复制别人文章,需要批量修改文章标题、关键词、正文、作者、来源、日期等等相关信息。因为文章标题或者文章内容变动是常有的事,如果手工改动的话,肯定会让人吐血,那么有什么办法可以批量替换相关内容呢?下面,白起SEO就给大家分享两种方法。
用户1088318
2025/05/21
4090
dedecms 怎么实现批量替换
相信对于很多织梦dedecms站长来说,应该经常遇到采集文章或者复制别人文章,需要批量修改文章标题、关键词、正文、作者、来源、日期等等相关信息。因为文章标题或者文章内容变动是常有的事,如果手工改动的话,肯定会让人吐血,那么有什么办法可以批量替换相关内容呢?下面,白起SEO就给大家分享两种方法。
用户1088318
2025/05/21
3160
如何用sql批量删除一个id段内的dedecms文章?
  之前因为ytkah批量添加了dedecms文章,数量有些多,后面出现问题了,想要删除一部分织梦文章,后台一篇篇删,删到手软(相关内容:修改dedecms关键词到手软),于是就想到了sql数据库操作
ytkah
2022/03/14
3.3K0
如何用sql批量删除一个id段内的dedecms文章?
dedecms清空所有文章怎么操作?sql语句如何写?
  小C新建了一个站,确切的说是复制,出于seo考虑,决定清空所有文章,那么dedecms清空所有文章怎么操作?sql语句如何写呢?特别提醒:修改之前一定要先做好备份,以防万一!下面的语句在迫不得已的
ytkah
2018/03/06
2.7K0
dedecms清空所有文章怎么操作?sql语句如何写?
dede 常用SQL总结
织梦cms不知大家用过没有,功能比较强大,但是对于我还是有一些不够,所以我总结了一些经常会使用的SQL,比如批量修改文章发布人、替换栏目字符串、批量修改文章点击数、批量修改文章命名规则等,这些SQL使用dedecmsv5.7测试,其他版本不保证。
老高的技术博客
2022/12/27
2.1K0
【DEDE建站教程】织梦网站报错代码汇总1
DEDE织梦cms常用的参数标签汇总、以及操作过程中的一些bug问题解决方法,dede网站二开,以下龙腾飞网络科技-小吴在建站实操中笔记记录,织梦dede建站教程保存使用非常方便:
攻城狮与产品喵
2025/03/13
4910
【DEDE建站教程】织梦网站报错代码汇总1
sql数据库批量替换dedecms内容关键字
之前写了一篇dedecms后台批量替换文章中的关键词,这边我们介绍一下用sql数据库批量替换dedecms内容关键字,当然要求你对数据库比较熟悉,修改前请自行做好备份。
ytkah
2022/03/14
3.2K0
DedeCMS织梦设置删除文章同步删除图片和附件策略
我们很多站长是否遇到这样的问题,比如我们开始建站的时候可能会更新不少的文章,也有是通过采集获取的图文。但是后续有可能考虑网站内容的变化调整,有些文章是准备删除不要。于是我们可能单篇、批量删除文章,不过我们把文章是删除,同时文章中有的图片和附件还在我们的图片文件夹中。
老蒋
2021/12/27
3.1K0
dedecms后台批量替换文章中的关键词
DEDECMS怎么样能快捷或者批量修改网站所有文章的超链接和锚文本,超链和所有关键词锚文本的链接需要修改?
ytkah
2022/03/14
3.4K0
dedecms后台批量替换文章中的关键词
织梦DEDECMS自动内链一个关键字对应多个链接随机调用的设置方法
利用dedecsm织梦自动内链的时候,可能会有一个关键字对应多个网站,随机调用网址的需求,比如(织梦自动内链)这个关键词一些文章内链链接到网站的首页,一些链接到文章页,但是织梦中原带的功能,一个关键词只能加一个网址,网上找了很多办法也没有找到可用的,还好米米素材网懂一点点php,哪就自己动手吧。下面是织梦自动内链一个关键字对应多个链接,随机调用这些链接的解决办法。
米米素材网
2023/03/23
1.4K0
织梦DEDECMS自动内链一个关键字对应多个链接随机调用的设置方法
DEDECMS织梦解决联动类别地区调用不显示第三级城市的方法
这篇文章主要为大家详细介绍了织梦模板联动类别地区调用不显示第三级城市的解决方法,具有一定的参考价值,感兴趣的小伙伴们可以参考一下,有需要的朋友可以收藏方便以后借鉴。
米米素材网
2022/07/10
1.8K0
DEDECMS织梦解决联动类别地区调用不显示第三级城市的方法
【DEDE伪静态】织梦cms网站如何做伪静态
DEDE织梦cms常用的参数标签汇总、以及操作过程中的一些bug问题解决方法,dede网站二开,以下龙腾飞网络科技-小吴在建站实操中笔记记录,织梦dede建站教程保存使用非常方便:
攻城狮与产品喵
2025/03/13
1.3K0
【DEDE伪静态】织梦cms网站如何做伪静态
DEDECMS织梦添加会员积分的方法
不需要插件实现织梦会员增加签到积分/金币方法,因为很多插件我们大家可能都不了解,有些也可以增加了脚本,所以自己手动添加的比较安全,现在把方法分享给大家。
米米素材网
2022/08/06
5.5K0
DEDECMS织梦添加会员积分的方法
wordpress使用SQL语句批量修改替换文章内容的方法
在我们在更换域名的时候文章和图片地址还是老域名怎么办,这里我们就可以使用SQL语句来进行批量修改将我们的老网址链接全部改成新网址,例如www.老.com改为www.新.com。我们就需要用到一下这个语句具体如图所示。
Hello-1
2022/08/30
1.9K0
wordpress使用SQL语句批量修改替换文章内容的方法
WordPress 文章内容网址URL自动生成超链接
对于mysql用户来说,其实这个问题很简单,但一般WordPress用户不一定得懂mysql。
Power
2023/06/01
6150
【说站】批量查找替换WordPress文章内容的三种方法
我们WordPress文章中有文字或者代码需要进行批量替换、删除的,如果一个个的进行手动修改会比较慢,也比较繁琐,这里品自行提供三种批量查找替换wordpress文章内容的方法供大家参考。
很酷的站长
2022/11/24
1.5K0
【说站】批量查找替换WordPress文章内容的三种方法
Typecho批量替换文章内链接与图片链接
最近几天本站一直被人打,于是我就想到了OSS没设置带宽封顶策略,于是开启缓存后OSS域名变更了,文章链接图片附件链接等全部失效,虽然网上有替换插件,但是没有改变数据库内容总感觉没从根本上解决问题,于是就利用SQL语句替换掉了域名,又可以访问了。开心
浩瀚博客
2022/03/23
1.8K0
Typecho批量替换文章内链接与图片链接
织梦CMS安装后的安全优化设置,有效防护木马
织梦CMS在安装完成后,新人往往会直接开始开发使用,忽视了一些安全优化的操作,这样会导致后期整个系统安全系数降低,被黑或者被注入的概率极高,毕竟这世界百分百存在着极多的无聊hacker对全网的网站进行扫描,扫到你这个菜站,尤其是使用率极高的DEDECMS,对你的站点下手的欲望更高,所以在开发前做好安全防范还是很有必要的!
米米素材网
2022/07/15
3.1K0
织梦CMS安装后的安全优化设置,有效防护木马
推荐阅读
相关推荐
【DEDE[sql执行]】DEDE数据库语句 DEDESQL命令批量替换 SQL执行语句
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档