[TOC] # 无主键表 ## 主键(Primary Key) 主键是在数据表中能够唯一标识一行的列的集合。主键需要满足以下规则: * 值不能为 NULL 或空串。 * 在全表范围内主键列集合的值唯一。 * 主键的值不允许变更。 ## 有主键表 有主键表即数据表中包含主键的表,在 OceanBase 数据库中需要满足以下规则: * 每个数据表最多拥有一个主键列集合。 * 主键列的数量不能超过 64 列,且主键数据总长度不能超过 16 KB。 在创建有主键表后,会自动为主键列创建一个全局唯一索引,可以通过主键快速定位到行。 以下面的 SQL 为例,创建了一个以 emp\_id 为主键的数据表 emp\_table,为有主键表。 ~~~ CREATE TABLE emp_table ( emp_id int PRIMARY KEY, emp_name varchar(100), emp_age int NOT NULL ); ~~~ ## 无主键表 数据表中未指定主键的表称为无主键表,由于没有全局索引,无主键表通常使用 ROWID 来快速定位到行。 以下面的 SQL 为例,数据表 student\_table 未指定主键,为无主键表。 ~~~ CREATE TABLE student_table ( student_id int NOT NULL, student_name varchar(100), student_age int NOT NULL ); ~~~ 在 OceanBase 数据库的实现中,无主键表采用自增列作为隐藏主键。 OceanBase 数据库的自增列是兼容 MySQL 的自增列模块,满足以下三个原则: * 多分区全局唯一 * 语句内连续递增 * 生成的自增列值比用户显式插入的大 无主键表利用了自增列的多分区全局唯一的原则,以此保证无主键表隐藏主键的唯一性。