• MySQL报错:A PRIMARY KEY must include all columns in the table's partitioning function
  • 发布于 1周前
  • 53 热度
    0 评论

最近工作业务上,需要创建一个表,用来记录数据;考虑到功能上线后,对应的数据量会很大,如果只建个单表,那么后期的表会很大,不利于维护。于是在建表的时候,采取对表进行分区的策略。在这个过程中,遇到了一些错误以及解决办法。


首先就是报错:Partitioning can not be used stand-alone in query .. mysql 创建分区。例如,对应的创表语句类似如下:
CREATE TABLE `day_log` (
  `id` bigInt(20) unsigned NOT NULL AUTO_INCREMENT COMMENT '主键id',
  `uid` int(11) unsigned NOT NULL DEFAULT '0' COMMENT '用户账号',
  //////一些其他字段
  `dateTime` bigInt(20) unsigned NOT NULL COMMENT '注册时间',
  PRIMARY KEY (`id`,`dateTime`),
  KEY `idx_did_dateline` (`did`,`dateTime`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COMMENT='记录表';
/*!50100 PARTITION BY RANGE (dateTime)
(PARTITION p202404 VALUES LESS THAN (1714492800) ENGINE = InnoDB,
 PARTITION p202405 VALUES LESS THAN (1717171200) ENGINE = InnoDB,
 PARTITION p202406 VALUES LESS THAN (1719763200) ENGINE = InnoDB) */;
执行SQL语句,报错如下:

其实是简单的错误,SQL语句,写错了,在分区之前,多了一个分号,报错。去掉这个分号就好了。

另外遇到一个问题就是:A PRIMARY KEY must include all columns in the table's partitioning function

出现这个问题的原因是:分区的字段必须是要包含在主键当中。这时候分区的字段要么是主键,要么把分区字段加入到主键中,从而形成复合主键。在这个SQL语句里面,由于是根据字段dateTime 来分区的,所以必须要把dateTime字段加入到主键里面,如下:

经过修改再次执行建表语句,此时就能创建成功了!

用户评论