无主键表
====

主键（Primary Key） 
------------------------

主键是在数据表中能够唯一标识一行的列的集合。主键需要满足以下规则：

* 值不能为 NULL 或空串。
* 在全表范围内主键列集合的值唯一。
* 主键的值不允许变更。

有主键表 
-------------

有主键表即数据表中包含主键的表，在 OceanBase 数据库中需要满足以下规则：

* 每个数据表最多拥有一个主键列集合。
* 主键列的数量不能超过 64 列，且主键数据总长度不能超过 16 KB。

在创建有主键表后，会自动为主键列创建一个全局唯一索引，可以通过主键快速定位到行。

以下面的 SQL 为例，创建了一个以 emp_id 为主键的数据表 emp_table，为有主键表。

```javascript
CREATE TABLE emp_table (
  emp_id int PRIMARY KEY,
  emp_name varchar(100),
  emp_age int NOT NULL
);
```

无主键表 
-------------

数据表中未指定主键的表称为无主键表，由于没有全局索引，无主键表通常使用 ROWID 来快速定位到行。

以下面的 SQL 为例，数据表 student_table 未指定主键，为无主键表。

```javascript
CREATE TABLE student_table (
  student_id int NOT NULL,
  student_name varchar(100),
  student_age int NOT NULL
);
```

在 OceanBase 数据库的实现中，无主键表采用自增列作为隐藏主键。

OceanBase 数据库的自增列是兼容 MySQL 的自增列模块，满足以下三个原则：

* 多分区全局唯一
* 语句内连续递增
* 生成的自增列值比用户显式插入的大

无主键表利用了自增列的多分区全局唯一的原则，以此保证无主键表隐藏主键的唯一性。
