两个字段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,满足分区要求
不行的,还是有限制
hash 是个示范的例子,给你参考的
唯一键也不行呀:joy:
那只能按照官方配置的要求来了
好的,感谢
此话题已在最后回复的 1 分钟后被自动关闭。不再允许新回复。