分区键与主键

两个字段id与time,id是主键来限制插入数据不要重复,time字段来分区,但是tidb限制分区的time字段包含在主键中,组合成联合主键,那么我没办法用id来限制数据不要重复了,因为id相同,time不同的话也是可以插入进去数据的,这个建表怎么设计呢

id加not null唯一约束

分区字段,有限制的

分区键,主键和唯一键

本节讨论分区键,主键和唯一键之间的关系。一句话总结它们之间的关系要满足的规则: 分区表的每个唯一键,必须包含分区表达式中用到的所有列

every unique key on the table must use every column in the table’s partitioning expression.

这个限制可以参考 mysql 的案例:https://www.cnblogs.com/zhishan/p/3285055.html

如果需要满足这种场景,id 值不重复就可以了,就不需要考虑限制插入了
CREATE TABLE table_name_hash (
id bigint(20) NOT NULL AUTO_INCREMENT COMMENT ‘主键’,
device_id varchar(100) DEFAULT NULL COMMENT ‘xxxxx’,
hc_deviceid bigint(20) NOT NULL DEFAULT ‘1’ COMMENT ‘device_id 的 hashcode’,
…这里省略了部分字段
PRIMARY KEY (id,hc_deviceid),
…这里省略了部分索引
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin SHARD_ROW_ID_BITS=4 AUTO_INCREMENT=8033064588 COMMENT=‘用户行为历史表’
PARTITION BY HASH( hc_deviceid )
PARTITIONS 30;

案例实践:TiDB 分区表优化实践

还有一种方案:
id为主键,建立 id 和 time 为唯一的联合索引,也可以满足分区建立的场景

综上所述,不论是联合主键,还是联合唯一键都能满足建立分区的需求

您好,刚才试了“ id为主键,建立 id 和 time 为唯一的联合索引” 这个方法也不行,还是提示报错,要把分区字段放到主键中。
我们业务场景是每条数据id唯一,time是插入数据时间,这种联合主键的话,只要插入时间不一样,就会造成数据的重复。
另外我们查询场景基本都是范围查询,用hash分区好像不太合适

id 列设置not null+unique约束, 满足唯一要求。主键还是id+time,满足分区要求

%E5%BE%AE%E4%BF%A1%E6%88%AA%E5%9B%BE_20210823144918
不行的,还是有限制

不要主键啊,就用唯一键试试
unique (id)
unique (id,time)

不过这样,,,不能满足 主键索引的需求了, :rofl:

1 个赞

hash 是个示范的例子,给你参考的

1 个赞

image
唯一键也不行呀:joy:

1 个赞

那只能按照官方配置的要求来了

1 个赞

好的,感谢:partying_face:

1 个赞

此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。