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