首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 數據庫知識 >  >> MySQL 資料庫 >> MySQL 綜合教學

MySQL 分區表唯一約束限制:分區鍵必須包含在所有唯一索引中,含主鍵

     編輯:MySQL 綜合教學

前言:分區表與唯一約束的「硬性綁定」規則

MySQL 5.1 分區表強制要求:**每個唯一索引 (含主鍵) 的所有欄位,必須包含分區鍵欄位**。違反即報錯 ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function。本文通過實驗演示該限制的具體表現與繞過策略。

核心規則

Partitioning Keys ⊆ Unique Keys:分區鍵欄位集合必須是每個唯一索引欄位集合的子集。

實驗 1:主鍵即分區鍵 → 合法


CREATE TABLE t1 (
  id INT NOT NULL,
  uid INT NOT NULL,
  PRIMARY KEY (id)
)
PARTITION BY RANGE (id) (
  PARTITION p0 VALUES LESS THAN (5) ENGINE=INNODB,
  PARTITION p1 VALUES LESS THAN (10) ENGINE=INNODB
);
-- Query OK

主鍵 (id) 包含分區鍵 id,通過。

實驗 2:主鍵非分區鍵 → 非法


CREATE TABLE t1 (
  id INT NOT NULL,
  uid INT NOT NULL,
  PRIMARY KEY (id)
)
PARTITION BY RANGE (uid) (  -- 分區鍵為 uid
  PARTITION p0 VALUES LESS THAN (5),
  PARTITION p1 VALUES LESS THAN (10)
);
-- ERROR 1503: A UNIQUE INDEX must include all columns in the table's partitioning function

主鍵 (id) 不包含分區鍵 uid,失敗。

實驗 3:額外唯一索引不含分區鍵 → 非法


CREATE TABLE t1 (
  id INT NOT NULL,
  uid INT NOT NULL,
  PRIMARY KEY (id),
  UNIQUE KEY (uid)
)
PARTITION BY RANGE (id) (
  PARTITION p0 VALUES LESS THAN (5),
  PARTITION p1 VALUES LESS THAN (10)
);
-- ERROR 1503: UNIQUE KEY (uid) 不包含分區鍵 id

合法設計模式

模式分區鍵主鍵/唯一索引合法性
主鍵即分區鍵idPRIMARY KEY (id)✅
複合主鍵含分區鍵idPRIMARY KEY (id, uid)✅
複合唯一索引含分區鍵idUNIQUE KEY (id, email)✅
唯一索引缺分區鍵idUNIQUE KEY (email)❌

繞過策略與架構取捨

  1. 將分區鍵加入所有唯一索引:UNIQUE KEY (id, email),但改變語義 (同 email 可在不同分區重複)
  2. 放棄唯一約束,改用應用層去重 + 普通索引:INDEX (email),定期跑批一致性掃描
  3. 不分區,改用物理分表 (Sharding):應用層路由,無分區表限制
  4. 升級 MySQL 8.0:引入 PARTITION BY KEY、SUBPARTITION,但核心規則未變

結語

MySQL 分區表的唯一約束限制本質上是為了**分區裁剪時的唯一性檢查效能**:若唯一索引不含分區鍵,插入時需跨所有分區檢查唯一性,敗壞分區性能初衷。設計時**優先讓分區鍵成為主鍵前綴**,或接受「應用層去重 + 普通索引」的工程妥協。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved