alter table books add primary key时不能指定CLUSTERED

测试环境,刚新安装完的环境。
Server version: 5.7.25-TiDB-v6.1.0 TiDB Server (Apache License 2.0) Community Edition, MySQL 5.7 compatible

mysql> show create table books\G
*************************** 1. row ***************************
       Table: books
Create Table: CREATE TABLE `books` (
  `id` bigint(20) NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `type` enum('Magazine','Novel','Life','Arts','Comics','Education & Reference','Humanities & Social Sciences','Science & Technology','Kids','Sports') DEFAULT NULL,
  `published_at` datetime DEFAULT NULL,
  `stock` int(11) DEFAULT NULL,
  `price` decimal(15,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

# 语法报错
mysql> alter table books add primary key(id) CLUSTERED;
ERROR 8200 (HY000): Adding clustered primary key is not supported. Please consider adding NONCLUSTERED primary key instead

# 删掉重建时指定primary key为CLUSTERED则正常
mysql> drop table books;
Query OK, 0 rows affected (0.21 sec)

mysql> CREATE TABLE `books` (
    ->   `id` bigint NOT NULL,
    ->   `title` varchar(100) DEFAULT NULL,
    ->   `type` enum('Magazine','Novel','Life','Arts','Comics','Education & Reference','Humanities & Social Sciences','Science & Technology','Kids','Sports') DEFAULT NULL,
    ->   `published_at` datetime DEFAULT NULL,
    ->   `stock` int DEFAULT NULL,
    ->   `price` decimal(15,2) DEFAULT NULL,
    -> primary key(id) CLUSTERED
    -> );
Query OK, 0 rows affected (0.08 sec)

mysql> show create table books\G
*************************** 1. row ***************************
       Table: books
Create Table: CREATE TABLE `books` (
  `id` bigint(20) NOT NULL,
  `title` varchar(100) DEFAULT NULL,
  `type` enum('Magazine','Novel','Life','Arts','Comics','Education & Reference','Humanities & Social Sciences','Science & Technology','Kids','Sports') DEFAULT NULL,
  `published_at` datetime DEFAULT NULL,
  `stock` int(11) DEFAULT NULL,
  `price` decimal(15,2) DEFAULT NULL,
  PRIMARY KEY (`id`) /*T![clustered_index] CLUSTERED */
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_bin

不能的

如果是指不能在alter table add primary key时指定的话,那错误提示应该改成需要在创建表DDL中指定,而不是提示未不支持CLUSTERED属性。


可以参考: 聚簇索引 | PingCAP Docs

至于您说的提示信息 可以反馈给官方 让他们改改 :thinking:

好的,感谢

我觉得提示的没什么问题,提示的就是“添加的时候不支持clustered 主键” :joy:

我觉得好像也没啥问题,从clustered表和NONCLUSTERED表底层kV结构就理解了,肯定不支持,报错我理解也还好,从你的意图来看 你是想加主键,但是clustered不支持,所以报错让你改为了NONCLUSTERED就可以加主键了,逻辑上好像也没啥问题。

这个地方不是很理解,如果主键是聚簇索引的话,那么key 就是主键了,value 就是表中除了主键之外的其他列,不知道为啥不支持建表之后创建聚簇索引了呢?

这个地方我理解,但是不知道表创建好了之后就不支持创建聚簇索引了呢,这个点有点不是很理解

物理存储要根据key排序的,目前还没有实现建表后创建聚簇索引,不过据说将来会支持。

我理解不是不支持 是对于clustered表 不允许创建主键,因为主键已经是key了,在创建相当于打乱底层数据存储格式,对于NONCLUSTERED表你创建好,之后是可以创建主键索引,这里的主键类似于mysql的二级索引,
主键值+rowid

你这样讲我就有点理解了,如果创建的话是不是就相当于这个KEY 出现了2次

是的 就像保留mysql的习惯,一个表只能创建一个主键索引类似。

好的,其实一直都不是很理解这个原理,一直都是死记的,这次明白了 :hand_with_index_finger_and_thumb_crossed: