MySQL 文档指出:
当您在表上定义 PRIMARY KEY 时,InnoDB 将其用作聚集索引。
但这不是唯一的可能性,您可以改为使用唯一索引进行聚类:
如果你没有为你的表定义 PRIMARY KEY,MySQL 会定位第一个唯一索引,其中所有键列都不是 NULL,InnoDB 将它用作聚集索引。
似乎可以这样说,如果我首先在表上创建唯一索引,它将被标记为聚集;然后我可以创建一个主键,它将是非聚集的:
CREATE TABLE Tmp_CUQTest
(
ID1 INT NOT NULL, -- Desired clustering field
ID2 INT NOT NULL -- Desired PK field
);
CREATE UNIQUE INDEX CUC_Tmp ON Tmp_CUQTest (ID1);
ALTER TABLE Tmp_CUQTest ADD CONSTRAINT PRIMARY KEY PK_Tmp (ID2);
但是,当我检查结果表时,我的希望破灭了:
Key Type Uni Columns
PRIMARY BTREE (clustered) YES ID2
ID1 BTREE YES ID1
DBA.SE 上的另一个问题意味着创建索引作为CREATE TABLE
脚本的一部分,而不是之后,作为单独的CREATE INDEX
语句,可能会有所作为。但是,我得到相同的结果。
有没有办法强制 MySQL 在我选择的唯一索引上进行集群,而不是主键,或者这个“后备选项”是否只适用于没有主键的表?
PRIMARY KEY
PRIMARY KEY
表上都有一个。PRIMARY KEY
总是聚集的;不能有任何其他“聚集”索引。UNIQUE
密钥(具有某些限制),要么是隐藏的序列号(与 `AUTO_INCREMENT; 6 字节不完全相同)。UNIQUE
和是和索引。辅助键
PRIMARY KEY
此 BTree 的“行”包含(即“聚集索引”)的列的副本。这就是辅助键可以到达行的方式。UNIQUE KEY
是两件事:辅助键(除非提升为 PK)和“唯一性约束”。其他注意事项
CREATE TABLE
对于大多数用途,您是在语句中创建索引还是CREATE INDEX
稍后再创建索引都没有关系。定义同上FOREIGN KEYs
。AUTO_INCREMENT
AUTO_INCREMENT
不一定要申报PRIMARY KEY
,甚至UNIQUE
。一招。可以执行以下操作。是你钓鱼的目的吗??
主键是唯一键和索引。因此,将 PK 创建为您想要集群的唯一索引。
创建之后添加索引并作为创建表的一部分产生相同的结果。