使用日期列进行分区,在工作中非常常见,但有时候总会遇到一些奇怪的问题。特此记录首次用TIMESTAMP列做分区时遇到的问题(因为此列收到数据库时区影响是不支持分区的,下文会详细描述)

因为需求中,需要保存到毫秒,又感觉TIMESTAMP占用空间较小,所以开始时采用TIMESTAMP(3)数据类型。关于数据类型保存到毫秒,以及占用空间见MySQL 日期时间类型精确到毫秒_宝哥66的博客-CSDN博客

因为是日志表数据量较大,所以采取按天分区,方便查询较快。查询资料,使用函数UNIX_TIMESTAMP写出sql

ALTER TABLE `s_schedule_log`
PARTITION BY RANGE COLUMNS (start_time) (
PARTITION p202204 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-01 00:00:00.000')),
PARTITION p20220501 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-02 00:00:00.000'))
);

报错:Error Code: 1659. Field 'start_time' is of a not allowed type for this type of partitioning。字段“start_time”是此类分区不允许的类型。既然如此就不采用列分区了,直接采用范围分区进行尝试

ALTER TABLE `s_schedule_log`
PARTITION BY RANGE (UNIX_TIMESTAMP(start_time)) (
PARTITION p202204 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-01 00:00:00.000')),
PARTITION p20220501 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-02 00:00:00.000'))
);

报错:Error Code: 1697. VALUES value for partition 'p202204' must have type INT。分区“p202204”的 VALUES 值必须为 INT 类型。此时使用select UNIX_TIMESTAMP('2022-05-01 00:00:00.000');发现打印果然是小数。决定寻找其他函数,网上居多都是使用这个函数,没有毫秒值时,确实可以使用,但有毫秒值就不行了,因长时间找不到合适的函数,还投机取巧了下,反正是想按天分区时间还有毫秒部分就无所谓了。使用UNIX_TIMESTAMP('2022-05-01 00:00:00')

ALTER TABLE `s_schedule_log`
PARTITION BY RANGE (UNIX_TIMESTAMP(start_time)) (
PARTITION p202204 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-01 00:00:00')),
PARTITION p20220501 VALUES LESS THAN (UNIX_TIMESTAMP('2022-05-02 00:00:00'))
);

报错:Error Code: 1491. The PARTITION function returns the wrong type。分区函数返回错误的类型。这次说的就是UNIX_TIMESTAMP(start_time)这部分有问题了,类型不对,还是得INT。特意还查了下官网,int,字符串,date类型都是直接支持的,带有时间的可以使用UNIX_TIMESTAMP函数,就带有毫秒的麻烦点儿,最后终于找到函数to_days(发现还是日期函数不熟,日期函数库估计有很多值得学习的)

ALTER TABLE `s_schedule_log`
PARTITION BY RANGE (to_days(start_time)) (
PARTITION p202204 VALUES LESS THAN (to_days('2022-05-01 00:00:00')),
PARTITION p20220501 VALUES LESS THAN (to_days('2022-05-02 00:00:00'))
);

报错:Error Code: 1486. Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed。常量、随机 或 依赖时区的表达式在分区函数中是不允许的。这不就是说start_time受时区影响了吗,被限制了。此时死心不得不将数据类型改为DATETIME(3)然后继续执行以上sql。发现依然
        报错:Error Code: 1503. A PRIMARY KEY must include all columns in the table's partitioning function。主键必须包含分区函数所有的列。也就是start_time不在主键中。(说实话有点崩溃了,感觉遇到了分区会遇到的所有问题,不过话说回来,遇到问题才能在学习中成长,解决问题是学习的过程中的宝贵的经验)。回头去看官网发现官网示例几乎都是没有创建主键或索引的,所以任意列创建分区都可以。此处已经尝试start_time创建索引后重试依然是这个错误。修改主键

ALTER TABLE `s_schedule_log`
CHANGE COLUMN `start_time` `start_time` DATETIME(3) NOT NULL COMMENT '开始时间' ,
DROP PRIMARY KEY,
ADD PRIMARY KEY USING BTREE (`log_id`, `start_time`);
;

继续执行以上分区SQL,创建分区成功!!!

分区创建成功,随之需要自动分区,请参考MySQL 定时新增分区_宝哥66的博客-CSDN博客

MySQL 日期时间分区问题相关推荐

  1. Mysql日期时间Extract函数介绍

    MySQL日期时间Extract函数的优点在于可以选取日期时间的各个部分,从年一直到微秒,让我们对MySQL日期时间的处理更为轻松. MySQL 日期时间 Extract(选取)函数. 1. 选取日期 ...

  2. 处理时间_7_60个Mysql日期时间函数汇总

    Mysql日期时间函数使用大全 需求描述 需求:列出mysql常见的日期.时间函数的使用方法以及注意事项. 解决方法:通过参考官方手册并验证来完成该需求. 注:1 当前以mysql来演示. 2 详细函 ...

  3. mysql日期时间操作函数详解

    前些天发现了一个巨牛的人工智能学习网站,通俗易懂,风趣幽默,忍不住分享一下给大家.点击跳转到教程. win7可以设定每周从哪一天开始,win2003等不能方便的修改.有的是周日开始,有的是周一开始.而 ...

  4. MySQL日期时间处理函数

    -- MySQL日期时间处理函数 SELECT NOW() FROM DUAL;-- 当前日期时间:2017-05-12 11:41:47 -- 在MySQL里也存在和Oracle里类似的dual虚拟 ...

  5. MySQL 日期/时间 操作函数(2.1)

    原文:http://www.51sdj.com/phpcms/picture/2009/0711/picture_133.html 一.MySQL 获得当前日期时间 函数 1.1 获得当前日期+时间 ...

  6. mysql当前时间往后推一周_一篇文章搞定Mysql日期时间函数

    前言 日期和时间函数部分也是我们日常工作中使用频率比较高的一部分.这一篇我们主要讲讲mysql里面的日期时间相关的函数,不同数据库之间基本相同,只会有个别函数的差异.大家掌握一个数据库的,其他的遇到不 ...

  7. MySQL 日期时间类型精确到毫秒

    MySQL 常用的日期时间类型常用的是datetime.timestamp.其中datetime占用5个字节(有些文档中说占用8个字节是不对的,默认也不会保存毫秒). ​​​​​​​ DATETIME ...

  8. mysql 日期时间格式化字符串_MySQL日期函数与日期转换格式化函数大全

    Mysql作为一款开元的免费关系型数据库,用户基础非常庞大,本文列出了MYSQL常用日期函数与日期转换格式化函数 1.DAYOFWEEK(date) SELECT DAYOFWEEK('2016-01 ...

  9. mysql日期时间函数

    MySQL 日期跟时间函数(一) 作者: Mr.Zhang MySQL 日期跟时间的样式 在MySQL 中有很多有用处的日期跟时间函数.我们常常看到许多应用于日期的计算是在代码 方面上进行的,但是其实 ...

最新文章

  1. 解决Windows安装TensorFlow报错:ERROR: Cannot uninstall 'wrapt'问题
  2. Bash on Windows 抢鲜测试 -- 介绍及安装
  3. Vaadin和DukeScript中的Hello World
  4. Groovy在Spring中的简单使用实例
  5. 如何有效解决C与C++的相互调用问题
  6. 整理的3500个常用汉字的调用字典
  7. RTT的线程同步篇——信号量
  8. mysql 函数 数字转字串_mysql中字符串和数字的互转函数
  9. 使用SQL语句获得服务器名称和IP 地址
  10. 在centos下安装django
  11. 在Fedora8上配置Apache Httpd
  12. linux用户间文件互传,linux之间的文件互传-scp命令
  13. 【转】几个颇有创意的网站推广方法
  14. 金融科技领域的安全威胁及金融科技安全分析
  15. Python字典集合数据结构深入理解
  16. 阿里云maven仓库地址
  17. 【03】Linux笔记
  18. https://imgsa.baidu.com/forum/pic/item/...【贴吧图床】
  19. Mac 常用软件注册码
  20. iOS开发笔记——PDF的显示和浏览

热门文章

  1. 华为WATCH Buds耳机升级失败的解决方案
  2. 淘宝网手机客户端应用开发见解带android版源码下载
  3. 未来互联网的发展趋势
  4. PanDownload网页版源码
  5. 今日新鲜事.片尾视频素材库专属头像剪映基础教程
  6. 计算机丢失divxdecoder.dll,divxdecoder.dll
  7. vivoy27android版本,系统UI体验_vivo Y27 - CNMO
  8. keyshot怎么批量渲染_KeyShot轻松快速渲染教散效果
  9. 三菱Q系列总线型项目程序全套
  10. 【树莓派开发日记1】1.3k预算的树莓派+显示屏+键鼠的选型与拆箱物理安装