【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function

这篇具有很好参考价值的文章主要介绍了【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

首先声明下我这边使用的mysql版本是5.7.29版本,当然下面的问题我这边也是基于这个版本。这里因为没有考证其他版本是否也会有这些问题,可自行官方文档来查阅资料

一个唯一键必须包含表分区函数所有的列,根据这个错误提示我们大概就知道怎么处理,但是why?我们还是沉下心来看下官网文档

关于主键和唯一键的限制

MySQL :: MySQL 5.7 Reference Manual :: 22.6.1 Partitioning Keys, Primary Keys, and Unique Keys

his 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 column in 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.) 

这段话大致概括的意思就是说我们的分区表,主键和唯一键必须包含分区表达式的所有列。反过来讲,分区表达式中的列至少有一个是联合主键和联合唯一键的某一列。

用官网的例子解释下

这个是错误的创建语句


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;

执行后,错误提示

 A PRIMARY KEY must include all columns in the table's partitioning function

【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function,数据库,mysql,数据库

根据上面官网大致概况的意思分析下上述分区表创建错误原因

t1表中UNIQUE KEY (col1, col2) 联合唯一键没有包含分区表达式HASH(col3) col3这一列,所以报错

t2标中 UNIQUE KEY (col1), UNIQUE KEY (col3) 两个唯一键没有包含分区表达式HASH(col1 + col3) 所有的列

这个是纠正后的创建语句

--col3是联合唯一键的一列字段
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;

--UNIQUE KEY (col1, col3) 这个唯一键必须包含分区表达式所有的列字段
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;

Since every primary key is by definition a unique key, this restriction also includes the table's primary key,

对于主键也是同样的规则约束

这里就不用分析错误原因了同上面的联合唯一键

CREATE TABLE t5 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    PRIMARY KEY(col1, col2)
)
PARTITION BY HASH(col3)
PARTITIONS 4;

CREATE TABLE t6 (
    col1 INT NOT NULL,
    col2 DATE NOT NULL,
    col3 INT NOT NULL,
    col4 INT NOT NULL,
    PRIMARY KEY(col1, col3),
    UNIQUE KEY(col2)
)
PARTITION BY HASH( YEAR(col2) )
PARTITIONS 4;

【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function,数据库,mysql,数据库

完整示例演示解决过程

那么下来我们就演示一个完整的例子来如何处理这种问题

创建并初始化订单表

CREATE TABLE test_order (
    id INT NOT NULL ,
    order_no varchar(20) not null ,
    create_time DATE NOT NULL,
    PRIMARY KEY(id),
    UNIQUE KEY(order_no)
)ENGINE=InnoDB  DEFAULT CHARSET=utf8;

insert into  test_order  VALUES(1,'001','2023-01-01');
insert into  test_order  VALUES(2,'002','2023-02-01');
insert into  test_order  VALUES(3,'003','2023-03-01');

根据时间字段做分区

alter table test_order  partition by range (TO_DAYS(CREATE_TIME)) (

	partition p_202301 values less than (TO_DAYS('2023-02-01')),
	partition p_202302 values less than (TO_DAYS('2023-03-01')),
	partition p_202303 values less than (TO_DAYS('2023-04-01'))
);

【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function,数据库,mysql,数据库

 如何解决呢

--重建主键
alter table test_order DROP PRIMARY KEY, ADD PRIMARY key(ID,CREATE_TIME);

--重建唯一键(删除原来的唯一索引,重新生成唯一键)
ALTER TABLE test_order DROP INDEX order_no, ADD UNIQUE KEY (`order_no`, `create_time`);

【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function,数据库,mysql,数据库

 看到这里,我们创建分区的sql已经执行成功了。

找到对应数据目录,我们也看到分区后数据idb文件的存储文件,表分区创建好后,对应的索引也会分区

【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function,数据库,mysql,数据库

这里强调一点,生产环境如果原来的表已经存在业务数据,并且业务量很大的情况下,我们还是要停机来处理创建表分区,这个需要注意谨慎操作文章来源地址https://www.toymoban.com/news/detail-736536.html

到了这里,关于【mysql表分区系】mysql创建分区表提示A PRIMARY KEY must include all columns in the table‘s partitioning function的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • HiveSQL分区的作用及创建分区表案例演示(图解)

    目录 一、分区的作用 二、单级分区表 1.准备工作 2.创建数据表 3.查询数据 4.创建分区数据表 5.添加数据 5.1添加方式1:静态分区(需要指定分区字段和值) 5.2添加方式2:动态分区(只需指定分区字段,分区字段相同的数据自动分配到同一个区) 三、多级分区表 1.准备工作 2.创建分区

    2024年01月17日
    浏览(54)
  • oracle分区表创建(自动按年、月、日分区)实战

    前言:工作中有一张表一年会增长100多万的数据,量虽然不大,可是表字段多,所以一年下来也会达到 1G,而且只增不改,故考虑使用分区表来提高查询性能,提高维护性。 oracle 11g 支持自动分区,不过得在创建表时就设置好分区。 如果已经存在的表需要改分区表,就需要将

    2024年02月02日
    浏览(41)
  • mysql分区表:日期分区

    1.创建分区表 2.查看分区 3.添加分区 4.存储过程:分区删除与创建 5.事件定时 6.触发器设计:子表每插入一行,总表获得一行 7.创建索引 8.添加枚举型字段

    2024年02月16日
    浏览(52)
  • PostgreSQL按日期列创建分区表

          在PostgreSQL中,实现自动创建分区表主要依赖于表的分区功能,这一功能从PostgreSQL 10开始引入。分区表可以帮助管理大量数据,通过分布数据到不同的分区来提高查询效率和数据维护的便捷性。以下是在PostgreSQL中自动创建分区表的一般步骤: 首先,你需要创建一个父表

    2024年02月21日
    浏览(44)
  • postgres分区表的创建-基于继承

    参考文档: http://postgres.cn/docs/12/ddl-partitioning.html 创建基于继承的分区表的步骤 1 创建父表 2 创建子表,从父表继承过来 3 创建函数及触发器,使插入的数据根据规则,插入到对应的子表中  -- 创建父表 -- 创建分区表,5个分区  -- 创建触发器函数,针对不同月份的数据,落入

    2023年04月09日
    浏览(42)
  • Hive创建分区表并插入数据

    业务中经常会遇到这种需求:数据每天全量更新,但是要求月底将数据单独保存一份以供后期查询某月节点的信息。这时就要考虑用到Hive的分区表实现,即按照月份创建分区表,相当于新的月份数据保存在新表,进而实现保存了历史数据。 分区表的创建本质是在HDFS创建了一

    2024年02月07日
    浏览(50)
  • MySQL 分区表设计

    1、分区表设计方案 当设计 MySQL 分区表时,需要考虑以下几个方面:分区策略、分区字段、分区数量和分区函数。下面是一个详细的示例,展示了如何设计和执行分区表的增删改查操作。 设计分区表: 考虑一个订单表的例子,我们可以按照订单创建时间对表进行范围分区。

    2024年02月07日
    浏览(51)
  • 用好 mysql 分区表

    为了保证MySQL的性能,我们都建议mysql单表不要太大,也经常有人问我这样的问题,整体来说呢,建议是:单表小于2G,记录数小于1千万,十库百表。如果但行记录数非常小,那么记录数可以再偏大些,反之,可能记录数到百万级别就开始变慢了。 那么,业务量在增长,数据

    2024年02月08日
    浏览(41)
  • mysql分区表 -列表分区(list prtition)

    示例,创建一张员工表按照employee_id进行列表分区: 查询0号分区: select * from employees partition(p0); select * from employees partition(p1); select * from employees partition(p0,p1); 和range分区一样,可以使用alter table … add/drop partition新增/删除分区: ALTER TABLE employees ADD PARTITION(PARTITION p2 VALUES IN

    2024年02月16日
    浏览(50)
  • mysql~关于mysql分区表的测试

    在MySQL 8.0中,可以通过创建自定义哈希函数来处理VARCHAR类型的字段,以便用作分区键。下面是一个简单的示例,演示如何在MySQL8.0中创建自定义哈希函数来处理VARCHAR类型的字段 分区后的表效果 创建自定义哈希函数: 在上面的示例中,我们创建了一个名为 custom_hash 的自定义

    2024年03月13日
    浏览(34)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包