MYSQL表分区操作错误1503解决方案
来源:互联网 发布:网络咨询和护士哪个好 编辑:程序博客网 时间:2024/05/22 15:51
from http://www.codesky.net/article/201004/168271.html
在对表进行分区时,如果分区字段没有包含在主键字段内,如表A的主键为ID,分区字段为createtime ,按时间范围分区,代码如下:
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
A PRIMARY KEY MUST INCLUDE ALL COLUMNS IN THE TABLE'S PARTITIONING FUNCTION
MySQL主键的限制,每一个分区表中的公式中的列,必须在主键/unique key 中包括
在MYSQL的官方文档里是这么说明的
18.5.1. Partitioning Keys, Primary Keys, and Unique Keys
This section discusses the relationship of partitioning keys with primary keys and unique keys. The rule governing this relationship can be expressed as follows: All columns used in the partitioning expr
In other words,every unique key on the table must use every columnin the table's partitioning expr
分区字段必须包含在主键字段内,至于为什么MYSQL会这样考虑,CSDN的斑竹是这么解释的:
为了确保主键的效率。否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。
下面讨论解决办法,毕竟在一张表里,日期做主键的还是不常见。
方法1:
顺应MYSQL的要求,就把分区字段加入到主键中,组成复合主键
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要把分区字段包含在主键内才能创建分区,那么在创建表的时候,先不指定主键字段,是否可以呢??
测试如下:
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
继续添加上主键
alter table t1 add PRIMARY KEY(ID)
错误1503,和前面一样的错误。
alter table t1 add PRIMARY KEY(ID,createtime)
创建主键成功,但还是复合主键,看来是没办法了,必须听指挥了。
主键创建成功,把ID加上自增字段设置
alter table t1 change id id int not null auto_increment;
alter table t1 auto_increment=1;
最后结论,MYSQL的分区字段,必须包含在主键字段内。
- MYSQL表分区操作错误1503解决方案
- MYSQL表分区操作错误1503解决方案
- MYSQL表分区操作错误1503解决方案.txt
- MYSQL表分区操作错误1503解决与证明
- Mysql 分区操作简介
- Mysql 分区操作简介
- MYSQL的分区操作
- mysql 分区操作
- MySql数据分区操作
- mysql分区基础操作
- mysql分区常用操作
- mysql分区常见操作
- mysql 数据库分区操作
- mysql 数据分区操作
- mysql分区类型及操作
- mysql分区类型及操作
- mysql 1045 错误解决方案
- mysql 1064 错误 解决方案
- Java生成验证码
- Java项目中对MongoDB数据库进行文件上传
- 字典树模板
- 查询jdk默认参数
- 想做数据科学家/工程师?从零开始系统规划大数据学习之路
- MYSQL表分区操作错误1503解决方案
- 学以致用之NamespaceHandlerSupport
- ccf201312-2
- IDEA 构建 java web项目两种方式
- HBase原理和设计
- PAT 1058 简单输入数学题
- GitHub学习-----如何解决 error: failed to push some refs to git
- Unity5.0 Shader 极简入门 (二)
- Ubuntu安装搜狗拼音输入法的步骤