[英]How to Create MySql Partitions without primary key?
我有一个使用序列号作为主键的数据库。 除了有一个可以复制的名为“date_time”的列。
现在我需要使用date_time
进行分区,如下所示。
ALTER TABLE data
PARTITION BY RANGE (TO_DAYS('date_time')) (
PARTITION p20220103 VALUES LESS THAN (TO_DAYS('2022-01-04 00:00:00')),
PARTITION p20220104 VALUES LESS THAN (TO_DAYS('2022-01-05 00:00:00')),
PARTITION p20220105 VALUES LESS THAN MAXVALUE
);
由于date_time
不是data
表中的主键,我无法创建分区。
ERROR 1503 (HY000): A PRIMARY KEY must include all columns in the table's partitioning function (prefixed columns are not considered).
我应该如何创建分区而不添加date_time
作为主键?
你不能。 规则很简单,在https://dev.mysql.com/doc/refman/8.0/en/partitioning-limitations-partitioning-keys-unique-keys.ZFC35FDC70AD5FC69D236EZ878中说明:
表上的每个唯一键都必须使用表分区表达式中的每一列。
如果表有一个主键或唯一键,但该键不包括分区表达式中的列,那么当您插入新行而不检查每个分区是否有重复项时,它不能强制唯一性。
解决此问题的唯一方法是允许像date_time
这样的列作为分区表达式,即定义没有主键或唯一键的表。
这有其自身的危害。 您可能需要一个唯一键,以便您可以单独处理行以更新或删除它们。 如果您的表没有主键,基于行的复制也会变得非常低效。
这通常意味着您无法按date_time
对表进行分区,甚至根本无法对表进行分区。 但这并不总是一件坏事。 分区不一定会带来很大的好处。 分区甚至会导致更多的复杂性,因为您可能有查询,无论如何都要搜索每个分区。
分区不是万能的,而且经常是一种负担。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.