繁体   English   中英

如何创建没有主键的 MySql 分区?

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM