头一次使用mysql表分区,遇到不少的问题,现在总结下遇到的问题和解决方案。

1、如果分区值类型不是整型值,会出现如下错误:

[Err] 1697 - VALUES value for partition 'p0' must have type INT

分区值必须为整型值。例如下方的建表就会出这样的错误:

create table rms (d date)

partition by range (d)

(partition p0 VALUES LESS THAN ('1995-01-01'),

partition p1 VALUES LESS THAN ('2010-01-01'));

类似的解决方案,改成下方的样子就可以通过:

create table rms (d TIMESTAMP)

partition by range (UNIX_TIMESTAMP(d))

(partition p0 VALUES LESS THAN (UNIX_TIMESTAMP('1995-01-01')),

partition p1 VALUES LESS THAN (UNIX_TIMESTAMP('2010-01-01')));

2、如果上方的错误示例,改成如下:

create table rms (d DATE)

partition by range (UNIX_TIMESTAMP(d))

(partition p0 VALUES LESS THAN (UNIX_TIMESTAMP('1995-01-01')),

partition p1 VALUES LESS THAN (UNIX_TIMESTAMP('2010-01-01')));

就会出现如下错误:

[Err] 1486 - Constant, random or timezone-dependent expressions in (sub)partitioning function are not allowed

这是因为UNIX_TIMESTAMP函数在转换DATE类型值时,需要考虑时区问题。以上错误信息的意思就是:常量、随机值和时区相关的表达式不能用于分区表达式中。

可以反过来考虑,假如mysql所在的系统今天如果更改了当前时区,那就会有可能出现更改前与更改后,同一日期的数据存储在不同分区的现象了。常量与随机值也同样如此,可能会因不同环境和时间出现不同的值。

如果真要存储DATE或DATETIME类型,那么可以改成以下解决方案:

create table rms (d DATE)

partition by range (to_days(d))

(partition p0 VALUES LESS THAN (to_days('1995-01-01')),

partition p1 VALUES LESS THAN (to_days('2010-01-01')));

3、如果主键或唯一索引键没包含分区使用的键,比如:

CREATE TABLE T1 (

id int(8) NOT NULL AUTO_INCREMENT,

createtime datetime NOT NULL,

PRIMARY KEY (id)

)

PARTITION BY RANGE(TO_DAYS (createtime))

(

PARTITION p0 VALUES LESS THAN (TO_DAYS('2010-04-15')),

PARTITION p1 VALUES LESS THAN (TO_DAYS('2010-05-01')),

PARTITION p2 VALUES LESS THAN (TO_DAYS('2010-05-15'))

);

就会出错:[Err] 1503 - A PRIMARY KEY must include all columns in the table's partitioning function

意思是主键必须包括所有分区函数中所有字段。

不仅是主键,连唯一索引键都会如此。以下建表SQL都会出错:

CREATE TABLE t1 (

col1 INT NOT NULL,

col2 DATE NOT NULL,

col3 INT NOT NULL,

col4 INT NOT NULL,

UNIQUE KEY (col1, col2)

)

PARTITION BY HASH(col3)

PARTITIONS 4;

CREATE TABLE t2 (

col1 INT NOT NULL,

col2 DATE NOT NULL,

col3 INT NOT NULL,

col4 INT NOT NULL,

UNIQUE KEY (col1),

UNIQUE KEY (col3)

)

PARTITION BY HASH(col1 + col3)

PARTITIONS 4;

CREATE TABLE t3 (

col1 INT NOT NULL,

col2 DATE NOT NULL,

col3 INT NOT NULL,

col4 INT NOT NULL,

UNIQUE KEY (col1, col2),

UNIQUE KEY (col3)

)

PARTITION BY HASH(col1 + col3)

PARTITIONS 4;

改成以下方式则可通过:

CREATE TABLE t1 (

col1 INT NOT NULL,

col2 DATE NOT NULL,

col3 INT NOT NULL,

col4 INT NOT NULL,

UNIQUE KEY (col1, col2, col3)

)

PARTITION BY HASH(col3)

PARTITIONS 4;

CREATE TABLE t2 (

col1 INT NOT NULL,

col2 DATE NOT NULL,

col3 INT NOT NULL,

col4 INT NOT NULL,

UNIQUE KEY (col1, col3)

)

PARTITION BY HASH(col1 + col3)

PARTITIONS 4;

4、另外,如果使用一些强制转换函数,分区不支持:

CREATE TABLE part_date1

( c1 int default NULL,

c2 varchar(30) default NULL,

c3 date default NULL) engine=myisam

partition by range (cast(date_format(c3,'%Y%m%d') as int))

(PARTITION p0 VALUES LESS THAN (19950101),

PARTITION p1 VALUES LESS THAN (19960101) ,

PARTITION p2 VALUES LESS THAN (19970101));

[Err] 1564 - This partition function is not allowed。

参考文章:

标签:01,限制,LESS,INT,分区,partition,VALUES,mysql,NULL

来源: https://www.cnblogs.com/xiwang6428/p/13582491.html

mysql 支持分区表,mysql表分区的限制相关推荐

  1. mysql按照时间自动创建分区表_mysql 表分区、按时间函数分区、删除分区、自动添加表分区...

    mysql 表分区的几种方式: RANGE分区:基于属于一个给定连续区间的列值,把多行分配给分区. LIST分区:类似于按RANGE分区,区别在于LIST分区是基于列值匹配一个离散值集合中的某个值来进 ...

  2. mysql 社区版 innodb_MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测)

    MySQL 表分区详解MyiSam引擎和InnoDb 区别(实测) / --------------------         写在最前面            ------------------ ...

  3. mysql 对已有表分区_mysql怎么对先有表进行分区

    mysql如何对先有表进行分区? 有一张表,已经创建了,是一张普通的表,先要对这张表进行hash分区,我用一下语句创建提示错误: mysql> alter table 33 -> part ...

  4. mysql按月进行表分区

    数据库 mysql 单表数据量达到千万.亿级,可以通过分表与表分区提升服务性能. 现有表accounting,4亿条数据,数据访问方式为insert与select,select为按月访问,为减少数据与 ...

  5. mysql按照省市给表分区_表分区-partition

    partition分区: 设置分区限制,t0:1-10,t1:10-20,t2:20-最大值: 插入数据后可以看到topic表出现了t0.t1.t2: 按照散点值分区: 创建地区表: 建立会员表,根据 ...

  6. oracle范围分区表,Oracle表分区之范围分区-Oracle

    Oracle表分区之范围分区 以表中的一个列或一组列的值的范围分区 语法: [sql] PARTITION BY RANGE (column_name) (    www.2cto.com PARTI ...

  7. 43 | 什么时候使用MySQL的分区表?(分区和分表是有区别的)

    一.先干一碗鸡汤 任何事情都是循序渐进的,无论自己有多期待一个好结果,都是急不来的,事压不垮人,但是情绪会压垮人. 二.干巴得的内容 2.1.分区表语法是什么?引擎中的存储结构是什么? CREATE ...

  8. mysql 分区表 外键_【MySQL】表分区

    MySQL表分区是MySQL提供的一种简单的数据表水平拆分方法. 分区表是一个逻辑表,它由多个物理子表组成. 目前只有 InnoDB 和 NDB 正式支持表分区. 注:表分区虽然可以缓解单表数据量过大 ...

  9. php创建mysql分区,MySql创建分区表

    PHP交流群:256726721 一.前沿知识1.分区表类型 RANGE分区.LIST分区.HASH分区.KEY分区.子分区 2.查询是否支持分区表 mysql> SHOW VARIABLES ...

最新文章

  1. 服务器 主动 推送 客户端浏览器 消息***
  2. 字节跳动_掌握Java字节码
  3. ubuntu下小键盘不能用
  4. 爆料称配备更大屏幕尺寸的Apple Silicon版iMac仍在研发中
  5. 改造Python中文拼音扩展库pypinyin补充自定义声母全过程
  6. SAP License:第三只眼看财务-快速编制现金流量
  7. [Ext JS 4] Grid 中的单元格添加Tooltip 的效果
  8. 转:mysql show processlist命令 详解
  9. 【工作提效】PLSQL使用技巧
  10. excel换行快捷键_13个excel快捷键,学会他们,让你的1秒钟,抵得上同事的5分钟...
  11. 批量打印远端PDF文件
  12. C++调用c#的.net Standard类库流程
  13. 二进制数相减计算机如何计算,二进制减法怎么算
  14. 游戏智能中的AI——从多角色博弈到平行博弈
  15. Ctrl 键失效或者 Ctrl + D键失效,不灵
  16. 分布式缓存(Redis)连杀
  17. [unity]在unity中创建圆锥体
  18. Unity性能优化 :合批篇
  19. Django路由写法
  20. Python+Django+Mysql个性化图书推荐系统 图书在线推荐系统 基于用户、项目、内容的协同过滤推荐算法(带设计报告)

热门文章

  1. u盘传输过程数据文件丢失如何恢复
  2. EasyClick脚本开发教程(6)获取抖音视频评论内容
  3. c语言数据结构及算法实现代码,数据结构算法实现及解析―配合严蔚敏_吴伟民编著的数据结构(C语言版和C++版)(作者 高一凡)源代码...
  4. 办公室建模,vue2+three.js
  5. 黑客专属记事本(编程记事本)
  6. 什么是c/c++运行时库
  7. 2019 vs 安装odt_2019年12月14日罗马协会直播预告
  8. android串口编程实例_PLC编程由浅到深 | 如何搞懂西门子PLC脉冲输出
  9. 全向和定向天线区别,何为天线增益
  10. 盘点2020年VR全景行业大事件,2021直上云霄