我有一个表foo,它被'created_at'分区,其主键为(id
,created_at
)。即:如何在分区MySQL数据库的字段中添加唯一索引?
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是唯一的。
UPDATE
我应该提到,我已经对表的主键:
PRIMARY KEY (`id`,`created_at`)
此外,bar_id可以为NULL。
嘿,你找出一个办法吗?我正在努力解决完全相同的问题。我甚至不明白为什么分区键必须是唯一键的一部分。无法理解它。 – varunl 2012-08-28 18:43:52
@varunl,我也有同样的问题。我需要使用`start datatime`字段作为分区键,并使用'id`字段作为主键,但是我必须将其他字段作为UNIQUE KEY,这些字段确实需要是唯一的。 – shgnInc 2015-04-23 06:07:01