测试环境
Server version: 5.7.25-TiDB-v6.1.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible
tidb [test]>show create table t1\G
*************************** 1. row ***************************
Table: t1
Create Table: CREATE TABLE `t1` (
`id` int(11) NOT NULL,
`c1` int(11) DEFAULT NULL,
PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin
tidb底层不是LSM结构的吗,那么此处显示 ENGINE=InnoDB 的用意是什么呢,不太理解。
另外,此时如果要删除t1表的PK,会有如下错误提示
tidb [test]>alter table t1 drop primary key;
ERROR 8200 (HY000): Unsupported drop primary key when the table's pkIsHandle is true
此处的 when the table’s pkIsHandle is true 从字面意思也不好理解为何不让删。
谢谢。
Jiawei
(渔不是鱼)
2
先说一下为什么primary key不支持删除吧。
从TiDB的底层数据存储格式来看,
数据的存储是KV结构,
对于CLUSTERED表,Key 是primary key,value是其他列,如果你要删除主键,那数据就没法存储了,
所以CLUSTERED表不支持删除主键,
然后engine=innodb,我理解为了兼容innodb的那些元数据表,比如information_schema的表,performance等这些库的表.
1 个赞
https://docs.pingcap.com/zh/tidb/stable/clustered-indexes#聚簇索引
官方文档的聚簇索引,看完就明白了
Tidb兼容mysql,显示 ENGINE=InnoDB 的用意 就是为了mysql server层的兼容
1、我删除CLUSTERED属性的PK后,能不能自动转成NON CLUSTERED的PK呢;
2、MySQL兼容显示engine=innodb也没必要的吧,直接把engine=xx去掉不是更兼容吗。
胡杨树旁
6
创建NON CLUSTERED 建表的时候需要标注一下
Jiawei
(渔不是鱼)
7
对于1来说,如果自动转成那部相当于重建表了,重新规划数据格式,那这个造成影响代价就太大了。
2我有点不明白,但是简单讲 说白了 就是能让你用tidb像用mysql那样子操作。
就是更强大的MySQL,例如,不必再使用分库分表中间件之类的了
system
(system)
关闭
9
此话题已在最后回复的 60 天后被自动关闭。不再允许新回复。