(推荐教程:mysql视频教程)
如果分区字段没有包含在主键字段内,如表A的主键为ID,分区字段为createtime ,按时间范围分区,代码如下:
复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE T1 (
id int(8) NOT NULL AUTO_INCREMENT,
createtime datetime NOT NULL,
PRIMARY KEY (id)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
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')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN MAXVALUE);
登录后复制
错误提示:#1503
复制代码1
A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLE'S PARTITIONING FUNCTION
登录后复制
MySQL主键的限制,每一个分区表中的公式中的列,必须在主键“unique key”中包括
在MYSQL的官方文档里是这么说明的
分区字段必须包含在主键字段内,至于为什么MYSQL会这样考虑,CSDN的斑竹是这么解释的:
为了确保主键的效率。否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。 copyright
下面讨论解决办法,毕竟在一张表里,日期做主键的还是不常见。
方法1:
顺应MYSQL的要求,就把分区字段加入到主键中,组成复合主键
复制代码1
2
3
4
5
6
7
8
9
10
11
12
13
CREATE TABLE T1 (
id int(8) NOT NULL AUTO_INCREMENT,
createtime datetime NOT NULL,
PRIMARY KEY (id,createtime)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
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')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN MAXVALUE);
登录后复制
测试通过,分区成功。
方法2:
既然MYSQL要把分区字段包含在主键内才能创建分区,那么在创建表的时候,先不指定主键字段,是否可以呢??
测试如下:
复制代码1
2
3
4
5
6
7
8
9
10
11
12
CREATE TABLE T1 (
id int(8) NOT NULL ,
createtime datetime NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
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')),
PARTITION p3 VALUES LESS THAN (TO_DAYS('2010-05-31')),
PARTITION p4 VALUES LESS THAN (TO_DAYS('2010-06-15')),
PARTITION p19 VALUES LESS ThAN MAXVALUE);
登录后复制
测试通过,分区成功。OK copyright
继续添加上主键
复制代码1
alter table t1 add PRIMARY KEY(ID)
登录后复制
错误1503,和前面一样的错误。
复制代码1
alter table t1 add PRIMARY KEY(ID,createtime)
登录后复制
创建主键成功,但还是复合主键,看来是没办法了,必须听指挥了。
主键创建成功,把ID加上自增字段设置
复制代码1
2
alter table t1 change id id int not null auto_increment;
alter table t1 auto_increment=1;
登录后复制
最后结论,MYSQL的分区字段,必须包含在主键字段内。
以上就是mysql添加分区出错怎么办?的详细内容,更多请关注靠谱客其它相关文章!
最后
以上就是玩命秋天最近收集整理的关于mysql添加分区出错怎么办?的全部内容,更多相关mysql添加分区出错怎么办内容请搜索靠谱客的其他文章。
本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
发表评论 取消回复