如何在分区的MySQL DB中的字段上添加唯一索引?

Dav*_*ney 5 mysql sql indexing unique

我有一个表foo,由'created_at'分区,主键为(id,created_at).即:

CREATE TABLE `foo` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `created_at` datetime NOT NULL DEFAULT '0000-00-00 00:00:00',
  `bar_id` int(11) DEFAULT NULL,
   ...

) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8
/*!50100 PARTITION BY RANGE (TO_DAYS(created_at))
(PARTITION p0 VALUES LESS THAN (733712) ENGINE = InnoDB,
 PARTITION p1 VALUES LESS THAN (733773) ENGINE = InnoDB,
 PARTITION p2 VALUES LESS THAN (733832) ENGINE = InnoDB,
 PARTITION p3 VALUES LESS THAN (733893) ENGINE = InnoDB,
...
)
Run Code Online (Sandbox Code Playgroud)

如何创建一个bar_id在所有分区中都是唯一的唯一索引?如果我尝试类似的东西:

CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id);
Run Code Online (Sandbox Code Playgroud)

我收到错误:

ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function
Run Code Online (Sandbox Code Playgroud)

但是,如果我在构建索引时包含分区函数(id,created_at),那么我最终得到的索引不能保证bar_id是唯一的.

UPDATE

我应该提到我已经在桌面上有一个主键:

PRIMARY KEY (`id`,`created_at`)
Run Code Online (Sandbox Code Playgroud)

此外,bar_id可以为NULL.

mlu*_*bke 0

创建主键。

来自关于分区的MySQL 文档:用于分区表达式的任何列都必须是表的主键(如果有一个)或(第一个)唯一键(如果它有唯一键但没有主键)的一部分。否则,您将看到错误消息“主键需要包含分区函数中的所有字段”。

如果表没有主键,但有一个或多个唯一键,则分区表达式中使用的任何列都必须是(第一个)唯一键的一部分。