分区表创建问题解惑

【 TiDB 使用环境】生产环境 /测试/ Poc
【 TiDB 版本】
【复现路径】做过哪些操作出现的问题
【遇到的问题:问题现象及影响】
CREATE TABLE IF NOT EXISTS opt_log (
id BIGINT(20) UNSIGNED NOT NULL AUTO_RANDOM,
mod_id BIGINT(20) UNSIGNED NOT NULL DEFAULT ‘0’,
act_id BIGINT(20) UNSIGNED NOT NULL DEFAULT ‘0’,
apkid TINYINT(1) UNSIGNED NOT NULL DEFAULT ‘0’,
deviceid TINYINT(1) UNSIGNED NOT NULL DEFAULT ‘0’,
content TEXT COMMENT ‘日志内容’,
user_id BIGINT(20) UNSIGNED NOT NULL DEFAULT ‘0’,
create_time INT(10) UNSIGNED NOT NULL DEFAULT ‘0’,
PRIMARY KEY (id,create_time)
) ENGINE=INNODB DEFAULT CHARSET=utf8 COMMENT ‘操作行为日志分区表’
PARTITION BY RANGE (create_time)
(PARTITION p202307 VALUES LESS THAN (UNIX_TIMESTAMP(‘2023-08-01 00:00:00’)),
PARTITION p202308 VALUES LESS THAN (UNIX_TIMESTAMP(‘2023-09-01 00:00:00’)),
PARTITION p202309 VALUES LESS THAN (UNIX_TIMESTAMP(‘2023-10-01 00:00:00’)),
PARTITION p202310 VALUES LESS THAN (UNIX_TIMESTAMP(‘2023-11-01 00:00:00’)),
PARTITION p202311 VALUES LESS THAN (UNIX_TIMESTAMP(‘2023-12-01 00:00:00’)),
PARTITION p202312 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-01-01 00:00:00’)),
PARTITION p202401 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-02-01 00:00:00’)),
PARTITION p202402 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-03-01 00:00:00’)),
PARTITION p202403 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-04-01 00:00:00’)),
PARTITION p202404 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-05-01 00:00:00’)),
PARTITION p202405 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-06-01 00:00:00’)),
PARTITION p202406 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-07-01 00:00:00’)),
PARTITION p202407 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-08-01 00:00:00’)),
PARTITION p202408 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-09-01 00:00:00’)),
PARTITION p202409 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-10-01 00:00:00’)),
PARTITION p202410 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-11-01 00:00:00’)),
PARTITION p202411 VALUES LESS THAN (UNIX_TIMESTAMP(‘2024-12-01 00:00:00’)),
PARTITION pmax VALUES LESS THAN (MAXVALUE));

创建分区表报错8216 - Invalid auto random: column id is not the integer primary key, or the primary key is nonclustered
请问各位有使用分区表吗?创建分区表的时候报这个错误,应该如何 调整?
【资源配置】进入到 TiDB Dashboard -集群信息 (Cluster Info) -主机(Hosts) 截图此页面
【附件:截图/日志/监控】

PRIMARY KEY (id ,create_time )改成
PRIMARY KEY (id ,create_time ) CLUSTERED

1 个赞


测试创建成功

请问加CLUSTERED是什么原理?另外PRIMARY KEY一定要加上create_time吗?

聚簇索引和非聚簇索引的区别,效率和性能上差别很大,官方的文档上有详细的描述。

因为有需要分区的场景,需要参与分区的key,都必须是主键。
来源于 mysql 的标准定义,可参考mysql 分区设定的原则。

请问你的是什么版本?为什么我的不成功

聚簇索引参考这里,https://docs.pingcap.com/zh/tidb/stable/clustered-indexes#聚簇索引
分区表的主键及唯一键参考这里,https://docs.pingcap.com/zh/tidb/stable/partitioned-table#分区键主键和唯一键

8216 - Invalid auto random: column id is not the integer primary key, or the primary key is nonclustered
加了 PRIMARY KEY (id ,create_time ) CLUSTERED也不行,报了上面的错。
可是本来默认就是/*T![clustered_index] CLUSTERED */的吧?

1 个赞

7.1版本tidb ,默认配置, tidb 新点的版本默认就是clustered的,不用特意指定

5.4好像只能支持auto_random在bigint类型的主键列上
https://docs.pingcap.com/zh/tidb/v5.4/auto-random#使用限制
我用6.6版本的创建是没问题的。

1 个赞

就是bigint类型的主键列,也不行。

不是,我看5.4的描述,是不是不能是联合主键啊?必须是bigint列的主键列。。。

如果不是组合的话,PRIMARY KEY (id)
会报下面这个错:
1503 - A PRIMARY KEY must include all columns in the table’s partitioning function

学到了

这个是分区表的限制,分区表分区键必须是主键的一部分,你把分区都去掉,当成一个普通表是不是就能创建了。。。

能创建。。

是v5.4.2版本吗?

这里主要两个事情:
1、是 auto random 有一定的使用限制。比如,需要是 int : https://docs.pingcap.com/zh/tidb/stable/auto-random#使用限制
2、partition 也有一定的使用限制,比如 分区键必须是 主键(唯一键)的一部分。https://docs.pingcap.com/zh/tidb/stable/partitioned-table#分区的约束和限制