我有一个表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,
...
)如何创建一个惟一的索引,使bar_id在所有分区中都是唯一的?如果我尝试这样的方法:
CREATE UNIQUE INDEX some_index USING BTREE ON foo (bar_id);我收到错误:
ERROR 1503 (HY000): A UNIQUE INDEX must include all columns in the table's partitioning function但是,如果我在构建索引时包含分区函数(id,created_at),那么我最终得到的索引并不保证bar_id是唯一的。
更新
我应该说我已经有了一个主键:
PRIMARY KEY (`id`,`created_at`)而且,bar_id可以是空的。
发布于 2012-02-13 09:57:21
错误消息本身解释了这个问题。请阅读手册,http://dev.mysql.com/doc/refman/5.5/en/partitioning-limitations-partitioning-keys-unique-keys.html
“规则是:在分区表的分区表达式中使用的所有列都必须是表可能拥有的每个唯一键的一部分。简而言之,表上的每个唯一键都必须使用表的分区表达式中的每一列。”
发布于 2011-02-04 00:20:21
创建主键。
来自分区方面的MySQL文档:用于分区表达式的任何列都必须是表的主键(如果有)或(第一)唯一键(如果它有唯一键但没有主键)的一部分。否则,您将看到错误消息,“主键需要包含分区函数中的所有字段”。
如果表没有主键,但有一个或多个唯一键,那么分区表达式中使用的任何列都必须是(第一个)唯一键的一部分。
发布于 2011-02-04 00:33:47
这可以通过一个备用表来存储唯一的bar_id和一个预插入触发器来完成.
https://stackoverflow.com/questions/4893264
复制相似问题