---
title: "定义列的约束类型 | OceanBase 文档中心"
description: 定义列的约束类型 为了确保表里的数据符合业务规则，您可以在列上定义约束。 约束定义在列上，可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时，会触发一个错误并回滚这个操作；当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时，也会触发一个错误并回滚这个操作。 约束类型 当前 OceanBase 数据…
---
切换语言

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

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

# 定义列的约束类型

更新时间：2026-06-17 19:29:47

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.0.0/zh-CN/500.administrator-guide/700.database-object-management/200.manage-tables/400.define-the-constraint-type-for-a-column.md)  

为了确保表里的数据符合业务规则，您可以在列上定义约束。

约束定义在列上，可以限制列里存储的值。当尝试在该列上写入或更新为违反约束定义的值时，会触发一个错误并回滚这个操作；当尝试在已有的表的列上加上一个跟现有数据相冲突的约束时，也会触发一个错误并回滚这个操作。

## 约束类型

当前 OceanBase 数据库支持的约束类型如下：

- 非空约束（`NOT NULL`）：不允许约束包含的列的值为 `NULL`。

  对于有非空约束的列，在 `INSERT` 语句中必须指明该列的值，除非该列还定义了非空的默认值。

  创建表 `tbl1`，并设置列 `col1` 为非空约束的示例如下：

  ```sql
  obclient> CREATE TABLE tbl1(col1 INT NOT NULL,col2 INT);
  Query OK, 0 rows affected

  obclient> DESC tbl1;
  +-------+---------+------+-----+---------+-------+
  | Field | Type    | Null | Key | Default | Extra |
  +-------+---------+------+-----+---------+-------+
  | col1  | int(11) | NO   |     | NULL    |       |
  | col2  | int(11) | YES  |     | NULL    |       |
  +-------+---------+------+-----+---------+-------+
  2 rows in set

  ```
 - 唯一约束（`UNIQUE`）：不允许约束包含的列的值有重复值，但是可以有多个 `NULL` 值。

  创建表 `tbl6`，并设置列 `col2` 为唯一约束的示例如下：

  ```sql
  obclient> CREATE TABLE tbl6(col1 INT UNIQUE,col2 INT);
  Query OK, 0 rows affected

  ```
 - 主键约束（`PRIMARY KEY`）： `NOT NULL` 约束和唯一约束的组合。

  创建表 `tbl2`，并设置列 `col1` 为主键的示例如下：

  ```sql
  obclient> CREATE TABLE tbl2(col1 INT PRIMARY KEY,col2 INT);
  Query OK, 0 rows affected

  obclient> DESC tbl2;
  +-------+---------+------+-----+---------+-------+
  | Field | Type    | Null | Key | Default | Extra |
  +-------+---------+------+-----+---------+-------+
  | col1  | int(11) | NO   | PRI | NULL    |       |
  | col2  | int(11) | YES  |     | NULL    |       |
  +-------+---------+------+-----+---------+-------+
  2 rows in set

  ```

  示例中，表 `tbl2` 有一个主键列 `col1`，该列不允许为 `NULL` 并且必须是不重复的。
 - 外键约束（`FOREIGN KEY`）：要求约束的列的值取自于另外一个表的主键列。

  创建外键约束的示例如下：

  ```sql
  obclient> CREATE TABLE tbl4(col1 INT,col2 INT,FOREIGN KEY(col2) REFERENCES tbl2(col1));
  Query OK, 0 rows affected

  ```

  示例中，表 `tbl4` 的列 `col2` 关联另一个表 `tbl2` 的主键列 `col1`。

  创建外键约束时，如果不指定外键名，系统会自动分配一个约束名，自动分配的约束名为 表名_OBFK_创建时间戳。例如，`t1_OBFK_1627747200000000`。

  OceanBase 数据库默认开启了外键约束检查，外键约束检查开关由租户变量 `foreign_key_checks` 来控制。

  更多 `foreign_key_checks` 变量的说明，请参见 [foreign_key_checks](https://www.oceanbase.com/docs/community-observer-cn-10000000000901268)。
 - `CHECK` 约束：要求数据库中某列的值符合指定的条件。

  您可以对单个列定义一个或多个 `CHECK` 约束，使该列只允许特定的值，也可以定义表级的 `CHECK` 约束，将一个 `CHECK` 约束应用于多个列。修改表名时，`CHECK` 约束名不会被修改。删除某个表时，同时也会删除应用于该表的 `CHECK` 约束。

  创建表 `tbl8`，并设置列 `col1` 的值需大于 `0` 的示例如下：

  ```sql
  obclient> CREATE TABLE tbl8(col1 INT CHECK(col1>0),col2 INT);
  Query OK, 0 rows affected

  ```

  创建 `CHECK` 约束时，如果未指定约束名称，系统会自动分配一个约束名，自动分配的约束名为 `表名_obchk_创建时间戳`，例如，`t1_OBCHECK_1629350823880271`。

更多创建约束的语法及详细介绍请参见 [CREATE TABLE](https://www.oceanbase.com/docs/community-observer-cn-10000000000901399)。

## 查看约束

约束创建成功后，您可以通过 `information_schema.TABLE_CONSTRAINTS` 视图来查看某个表的约束。示例如下：

```sql
obclient> SELECT * FROM information_schema.TABLE_CONSTRAINTS WHERE TABLE_NAME='tbl6';
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| CONSTRAINT_CATALOG | CONSTRAINT_SCHEMA | CONSTRAINT_NAME | TABLE_SCHEMA | TABLE_NAME | CONSTRAINT_TYPE |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
| def                | test              | col1            | test         | tbl6       | UNIQUE          |
+--------------------+-------------------+-----------------+--------------+------------+-----------------+
1 row in set

```

## 管理约束

OceanBase 数据库支持对约束进行以下管理：

### 管理主键约束

OceanBase 数据库支持为已存在的表添加主键约束和修改主键约束。

添加主键约束的 SQL 语法如下：

```sql
ALTER TABLE table_name ADD PRIMARY KEY (column_name);

```

删除主键的 SQL 语法如下：

```sql
ALTER TABLE table_name DROP PRIMARY KEY;

```

示例：

1. 创建表 `tbl2`。

   ```sql
   obclient> CREATE TABLE tbl2(col1 INT,col2 INT);

   ```
 2. 为表 `tbl2`添加主键。

   ```sql
   obclient> ALTER TABLE tbl2 ADD PRIMARY KEY (col1);

   ```
 3. 删除表 `tbl2` 的主键。

   ```sql
   obclient> ALTER TABLE tbl2 DROP PRIMARY KEY;

   ```

### 管理外键约束

OceanBase 数据库支持为已存在的表添加外键约束和删除外键约束。

示例如下：

- 先创建表 `tbl5`，再为表 `tbl5` 的列 `col2` 添加外键，关联的主表为 `tbl2`。

  ```sql
  obclient> CREATE TABLE tbl5(col1 INT,col2 INT);
  Query OK, 0 rows affected

  obclient> ALTER TABLE tbl5 ADD CONSTRAINT tbl5_fk1 FOREIGN KEY(col2) REFERENCES tbl2(col1);
  Query OK, 0 rows affected

  ```
 - 删除表 `tbl5` 的列 `col1` 的外键。

  ```sql
  obclient> SELECT TABLE_SCHEMA 数据库名,TABLE_NAME 表名,COLUMN_NAME 列名,CONSTRAINT_NAME  约束名 FROM information_schema.KEY_COLUMN_USAGE;
  +--------------+--------+--------+----------------------------+
  | 数据库名     | 表名   | 列名   | 约束名                     |
  +--------------+--------+--------+----------------------------+
  | test         | tbl2   | col1   | PRIMARY                    |
  | test         | tbl3   | col1   | PRIMARY                    |
  | test         | tbl3   | col2   | PRIMARY                    |
  | test         | tbl4   | col2   | tbl4_OBFK_1645173651329873 |
  | test         | tbl5   | col1   | tbl5_OBFK_1645174931376110 |
  | test         | tbl5   | col2   | tbl5_fk1                   |
  +--------------+--------+--------+----------------------------+
  6 rows in set

  obclient> ALTER TABLE tbl5 DROP FOREIGN KEY tbl5_OBFK_1645174931376110;
  Query OK, 0 rows affected

  ```

### 管理唯一约束

OceanBase 数据库支持为已存在的表添加唯一约束。

先创建表 `tbl7`，再为表 `tbl7` 的列 `col2` 添加唯一约束的示例如下：

```sql
obclient> CREATE TABLE tbl7(col1 INT,col2 INT);
Query OK, 0 rows affected

obclient> ALTER TABLE tbl7 ADD UNIQUE(col2);
Query OK, 0 rows affected

```

### 管理 NOT NULL 约束

OceanBase 数据库支持将表中列的属性修改为 `NOT NULL`。

先创建表 `tbl9`，再将表的列属性修改为 `NOT NULL` 的示例如下：

```sql
obclient> CREATE TABLE tbl9(c1 int);
Query OK, 0 rows affected

obclient> ALTER TABLE tbl9 MODIFY c1 int NOT NULL;
Query OK, 0 rows affected

```

> **注意**
>
>  
>
> 由于在 OceanBase 数据库中，`NOT NULL` 为列属性，故无法通过 `information_schema.TABLE_CONSTRAINTS` 视图查看表中列的 `NOT NULL` 属性。

### 管理 CHECK 约束

OceanBase 数据库支持为已存在的表添加 `CHECK` 约束，同时支持修改、删除表的 `CHECK` 约束。

示例如下：

- 为表 `tbl8` 的列 `col2` 添加 `CHECK` 约束。

  ```sql
  obclient> ALTER TABLE tbl8 ADD CONSTRAINT tbl8_c1 CHECK(col2>0);

  ```
 - 修改表的 `CHECK` 约束。

  默认情况下，`CHECK` 约束创建后为启用状态。如果您希望该约束不生效，则可以对该约束执行启用或禁用操作。

     - 禁用 `CHECK` 约束：

      ```sql
      obclient> ALTER TABLE tbl8 ALTER CHECK tbl8_c1 NOT ENFORCED;

      ```
     - 启用 `CHECK` 约束：

      ```sql
      obclient> ALTER TABLE tbl8 ALTER CHECK tbl8_c1 ENFORCED;

      ```
 - 删除表的 `CHECK` 约束。

  ```sql
  obclient> ALTER TABLE tbl8 DROP CHECK tbl8_c1;

  ```

更多创建约束的语法及详细介绍请参见 [ALTER TABLE](https://www.oceanbase.com/docs/community-observer-cn-10000000000901403)。

## 关于时间列的默认时间设置

当列上有 `NOT NULL` 约束时，通常建议设置为默认值。当列类型是日期或时间类型时，可以设置默认值为数据库当前时间。

- 示例：为表的时间列设置默认值，可以使用 `current_timestamp` 函数。

```sql
obclient> CREATE TABLE t1(
    id bigint NOT NULL PRIMARY KEY
    , gmt_create datetime NOT NULL default current_timestamp
    , gmt_modified datetime NOT NULL default current_timestamp
);
Query OK, 0 rows affected

obclient> INSERT INTO t1(id) VALUES(1),(2),(3);
Query OK, 3 rows affected

obclient> SELECT * FROM t1;
+----+---------------------+---------------------+
| id | gmt_create            | gmt_modified          |
+----+---------------------+---------------------+
|  1 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
|  2 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
|  3 | 2020-02-27 17:09:23 | 2020-02-27 17:09:23 |
+----+---------------------+---------------------+
3 rows in set

```

 上一篇 下一篇 ![有帮助](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) 咨询热线
