是的,因为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)
);