Mysql 每月分区 - 错误代码 : 1503 A PRIMARY KEY must include all columns in the table's partitioning function

标签 mysql sql create-table alter-table

这里有类似的案例,但对我来说没有任何作用。我已经创建了表:

CREATE TABLE `message` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `message_content` longtext,
  `recipient` varchar(255) DEFAULT NULL,
  `send_time` datetime DEFAULT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `send_time` (`send_time`, `id`))
 ENGINE=InnoDB DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci;

我需要添加分区 - 每个月创建新分区:

ALTER TABLE messages.message
PARTITION BY RANGE(TO_DAYS(`send_time`))
(PARTITION p01 VALUES LESS THAN (TO_DAYS('2019-01-01')) ENGINE = InnoDB,
PARTITION p02 VALUES LESS THAN (TO_DAYS('2019-02-01')) ENGINE = InnoDB,
PARTITION p03 VALUES LESS THAN (TO_DAYS('2019-03-01')) ENGINE = InnoDB,
PARTITION p04 VALUES LESS THAN (TO_DAYS('2019-04-01')) ENGINE = InnoDB,
PARTITION p05 VALUES LESS THAN (TO_DAYS('2019-05-01')) ENGINE = InnoDB,
PARTITION p06 VALUES LESS THAN (TO_DAYS('2019-06-01')) ENGINE = InnoDB,
PARTITION p07 VALUES LESS THAN (TO_DAYS('2019-07-01')) ENGINE = InnoDB,
PARTITION p08 VALUES LESS THAN (TO_DAYS('2019-08-01')) ENGINE = InnoDB,
PARTITION p09 VALUES LESS THAN (TO_DAYS('2019-09-01')) ENGINE = InnoDB,
PARTITION p10 VALUES LESS THAN (TO_DAYS('2019-10-01')) ENGINE = InnoDB,
PARTITION p11 VALUES LESS THAN (TO_DAYS('2019-11-01')) ENGINE = InnoDB,
PARTITION p12 VALUES LESS THAN (TO_DAYS('2019-12-01')) ENGINE = InnoDB)

我已经尝试过其他答案中的解决方案(例如添加UNIQUE KEY),但没有任何效果对我有用。这是我得到的:

  SQL State  : HY000
  Error Code : 1503
  Message    : A PRIMARY KEY must include all columns in the table's partitioning function

最佳答案

分区列必须是主键的一部分,仅有 UNIQUE 索引是不够的。请参阅the mysql docs :

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. [...] This also includes the table's primary key, since it is by definition a unique key.

您可能希望将唯一键设为主键,例如:

PRIMARY KEY (`id`, `send_time`)

关于Mysql 每月分区 - 错误代码 : 1503 A PRIMARY KEY must include all columns in the table's partitioning function,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54036563/

相关文章:

mysql - 通过Airflow更新SQL数据库中的大量数据

php - 如何在 PHP 中显示 MySQL Select 语句结果

mysql - 更新 MySQL 表中的 Varchar 条目

mysql - 将警告存储到文件 MySQL

mysql - 在 MySql 中创建行向上移动的新列

mysql - 在产品表中创建外键时出错

MySQL结合UPDATE和SELECT查询

c# - MySqlBulkLoader 的解释

mysql - 使用 sql、codeigniter 统计 8 年级男女学生总数

sql - 数据如何加载到sql server内存中