---
title: github-fill
description: 主键表和无主键表 OceanBase 数据库支持主键表和无主键表。本文主要介绍主键以及有主键表和无主键表的使用规则。 主键（Primary Key） 主键是在数据库的表中能够唯一标识一行的列的集合。主键需要满足以下规则： 值不能为 NULL 或空字符串 在全表范围内主键列集合的值唯一 有主键表 有主键表即表中包含主键…
---
切换语言

- 中文站 - 简体中文
- International - English
- 日本站 - 日本語

文档反馈![](https://mdn.alipayobjects.com/huamei_22khvb/afts/img/A*P8CuR4UJ_FkAAAAAAAAAAAAADiGDAQ/original) OceanBase 数据库分布式版 - V 4.1.0

# 主键表和无主键表

更新时间：2023-07-28 10:45:58

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.1.0/zh-CN/700.reference/100.oceanbase-database-concepts/400.database-objects/100.database-objects-of-oracle-mode/200.table-of-oracle-mode/800.primary-key-tables-and-tables-without-a-primary-key-of-oracle-mode.md)  

OceanBase 数据库支持主键表和无主键表。本文主要介绍主键以及有主键表和无主键表的使用规则。

## 主键（Primary Key）

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

- 值不能为 `NULL` 或空字符串
 - 在全表范围内主键列集合的值唯一

## 有主键表

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

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

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

如下例所示，创建了一个以 `emp_id` 为主键的表 `emp_table`，它属于有主键表。

```sql
CREATE TABLE emp_table (
  emp_id INT PRIMARY KEY,
  emp_name VARCHAR(100),
  emp_age INT NOT NULL
);

```

## 无主键表

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

如下例所示，表 `student_table` 未指定主键，它属于无主键表。

```sql
CREATE TABLE student_table (
  student_id INT NOT NULL,
  student_name VARCHAR(100),
  student_age INT NOT NULL
);

```

OceanBase 数据库的无主键表采用分区级自增列作为隐藏主键。

OceanBase 数据库的分区级自增列，保证其值在每个分区内是唯一的，但不保证插入数据获取到的分区级自增列一定是严格自增的。

 上一篇 下一篇 ![有帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*y6ocSqN8cqsAAAAAAAAAAAAAARQnAQ)![无帮助](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*BG9IQJyLHF8AAAAAAAAAAAAAARQnAQ)![反馈](https://gw.alipayobjects.com/mdn/ob_asset/afts/img/A*eTWdQKCRKHwAAAAAAAAAAAAAARQnAQ)[AI](https://www.oceanbase.com/obi) 咨询热线
