【发布时间】:2011-06-21 01:34:14
【问题描述】:
我有一个表 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 可以为 NULL。
【问题讨论】:
-
嘿,你找到办法了吗?我正在努力解决完全相同的问题。我什至不明白为什么分区键必须是唯一键的一部分。无法理解它。
-
@varunl,我也有同样的问题。我需要使用
start datatime字段作为分区键,并使用id作为主键,但我必须将其他字段作为唯一键,这些字段确实需要是唯一的。