是的,因为user_id它不是表的一部分,primary key(s)或者unique keys您不能单独为user_id您的表创建分区,因为DOC非常清楚地说明了这一点
表上的每个唯一键都必须使用表分区表达式中的每一列
所以对于你的情况,你可以做的是unique key在你的桌子上id添加一个user_id
alter table myTable add unique key uk_id_userid (id, user_id);
然后只为列添加范围分区,user_id如下所示:
alter table myTable partition by range (user_id) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN (40)
);
注意由于您已经有一个包含值的表来定义分区范围,因此您需要环绕user_id分区中列的所有现有值。也就是说,如果你有一个user_id不能1000定义你的最后一个分区,PARTITION p3 VALUES LESS THAN (1000)那将会失败。您将需要一个分区,即:PARTITION p3 VALUES LESS THAN (2000)或PARTITION p3 VALUES LESS THAN MAXVALUE
看到它在这里工作:http ://sqlfiddle.com/#!9/8ca7ed
完整的工作示例:
create table myTable (
id bigint not null auto_increment,
user_id bigint not null,
comment text,
key (id)
) engine=InnoDb;
insert into myTable (user_id, comment) values
(1, 'bla'), (1, 'ble'), (1, 'bli'), (1, 'blo'),
(12, 'bla'), (12, 'ble'), (12, 'bli'), (12, 'blo'),
(23, 'bla'), (23, 'ble'), (23, 'bli'), (23, 'blo'),
(34, 'bla'), (34, 'ble'), (34, 'bli'), (34, 'blo');
alter table myTable add unique key uk_id_userid (id, user_id);
alter table myTable partition by range (user_id) (
PARTITION p0 VALUES LESS THAN (10),
PARTITION p1 VALUES LESS THAN (20),
PARTITION p2 VALUES LESS THAN (30),
PARTITION p3 VALUES LESS THAN (40)
);