千家信息网

如何解决mysql添加分区出错的问题

发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,这篇文章主要介绍如何解决mysql添加分区出错的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!mysql添加分区出错,报"1503"错误的原因:每一个分区表中的公式中的列,
千家信息网最后更新 2025年02月01日如何解决mysql添加分区出错的问题

这篇文章主要介绍如何解决mysql添加分区出错的问题,文中介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们一定要看完!

mysql添加分区出错,报"1503"错误的原因:每一个分区表中的公式中的列,必须在主键"unique key"中包括,否则就报错;解决方法:先使用"PRIMARY KEY"关键字创建一个复合主键,将分区字段加入到主键中,再进行分区操作。

如果分区字段没有包含在主键字段内,如表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=utf8PARTITION 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 expression for a partitioned table must be part of every unique key that the table may have.

In other words,every unique key on the table must use every columnin the table's partitioning expression. (This also includes the table's primary key, since it is by definition a unique key. This particular case is discussed later in this section.) For example, each of the following table creation statements is invalid:

分区字段必须包含在主键字段内,至于为什么MYSQL会这样考虑,CSDN的斑竹是这么解释的:

为了确保主键的效率。否则同一主键区的东西一个在A分区,一个在B分区,显然会比较麻烦。 copyright

下面讨论解决办法,毕竟在一张表里,日期做主键的还是不常见。

方法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=utf8PARTITION 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=utf8PARTITION 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

继续添加上主键

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添加分区出错的问题的所有内容,感谢各位的阅读!希望分享的内容对大家有帮助,更多相关知识,欢迎关注行业资讯频道!

字段 成功 错误 方法 测试 问题 公式 内容 办法 还是 中包 分区表 东西 代码 价值 关键 关键字 兴趣 原因 官方 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 深圳软件开发公司注册流程 不履行网络安全保护义务案件 网络技术选型的策略是什么 oracle数据库复习 计算机网络技术拓补图文件 关干网络安全班会心得体会 数据库 嵌入式是什么意思 nonsql 数据库 数据库连接成功表不存在 做游戏后端是不是就是服务器 松江区辅助网络技术备案 中文数据库怎么检索信息 心动网络技术培训 艾尔登法环 无法连接服务器 魔兽世界tbc服务器统计 服务器如何添加客户端地址 sql数据库报错1431 svn服务器无法连接 哪些网络安全行为是触犯法律的 软件开发部经理年薪 智能电子软件开发中心 浪潮 存储服务器 电信 代理服务器 中国移动远程服务器错误怎么回事 黄山软件开发公司哪家好 备忘录共享显示服务器出现错误 成都全盛网络技术有限公司 导入unl文件到数据库 宜兴软件开发哪个公司靠谱 新能源汽车网络技术论文
0