---
title: github-fill
description: "INSERT 描述 该语句用于添加一个或多个记录到表中。 语法 INSERT [hint_options] { single_table_insert | multi_table_insert } single_table_insert: { INTO insert_table_clause opt_nologgin…"
---
切换语言

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

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

# INSERT

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

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.1.0/zh-CN/700.reference/400.development-reference/100.sql-syntax/300.common-tenant-of-oracle-mode/900.sql-statement-of-oracle-mode/200.dml-of-oracle-mode/200.insert-of-oracle-mode.md)  

## 描述

该语句用于添加一个或多个记录到表中。

## 语法

```sql
INSERT [hint_options] { single_table_insert | multi_table_insert }

single_table_insert:
    { INTO insert_table_clause opt_nologging '(' column_list ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    | INTO insert_table_clause opt_nologging '(' ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    | INTO insert_table_clause opt_nologging values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    }

opt_nologging:
    { NOLOGGING | /*EMPTY*/ }

returning_exprs:
    projection_col_name [,projection_col_name ...]

insert_into_clause:
    { INTO into_var_list | BULK COLLECT INTO into_var_list}

into_var_list:
    { USER_VARIABLE | ref_name } [, { USER_VARIABLE | ref_name }...]

values_clause:
    VALUES ({ expr | DEFAULT } [, { expr | DEFAULT } ]...  )

multi_table_insert:
    { ALL { insert_into_clause [ values_clause ] [error_logging_clause] }
    | conditional_insert_clause
    } subquery

conditional_insert_clause:
    [ ALL | FIRST ]
    WHEN condition
    THEN insert_into_clause
    [ values_clause ]
    [ error_logging_clause ]
    [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
    [ WHEN condition
        THEN insert_into_clause
        [ values_clause ]
        [ error_logging_clause ]
        [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
    ]...
    [ ELSE insert_into_clause
        [ values_clause ]
        [ error_logging_clause ]
        [ insert_into_clause [ values_clause ] [ error_logging_clause ] ]...
    ]

error_logging_clause:
    LOG ERRORS [ INTO [schema.] table_name ] [ (simple_expression) ] [ REJECT LIMIT { integer | UNLIMITED } ]

```

## 参数解释

| 参数 | 描述 |
| --- | --- |
| hint_options | 指定 Hint 选项，为可选项。 |
| single_table_insert | 单表插入。 |
| insert_table_clause | 指定的插入的表，可以是基表、可更新视图、特殊子查询。 |
| opt_nologging | 尽量减少插入时的日志信息。 |
| column_list | 指定要插入的列名。 |
| returning_exprs | 返回插入数据之后的投影列。 |
| insert_into_clause | 将插入数据之后的列值插入到指定列表中。 |
| multi_table_insert | 多表插入。 |
| conditional_insert_clause | 带条件的多表插入。   - `ALL`：遍历所有匹配条件的分支，只要满足条件就会将数据插入对应的表。 - `FIRST`：找到第一个满足条件的分支后，将数据插入该分支对应的表，不会再继续检查剩余分支的条件是否满足。 |
| error_logging_clause | 将 SQL 错误和受影响的行数列中的值保存在一个错误记录表。 |

#### 注意

特殊子查询指的类似于可更新视图对应的子查询，这类子查询不应该包含复杂的算子（比如 `group by`、`distinct`、`window function` 等）。

## 示例

示例表及数据基于以下定义：

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

```

- 单表插入：向表 `tbl1` 中插入一行数据。

  ```sql
  obclient> INSERT INTO tbl1 VALUES(1,2,3);
  Query OK, 1 row affected

  obclient> SELECT * FROM tbl1;
  +------+------+------+
  | COL1 | COL2 | COL3 |
  +------+------+------+
  |    1 |    2 |    3 |
  +------+------+------+
  1 row in set

  ```
 - 单表插入：直接向子查询中插入数据。

  ```javascript
  obclient>INSERT INTO (SELECT * FROM tbl1) VALUES(1,2,3);
  Query OK, 1 row affected

  obclient> SELECT * FROM tbl1;
  +----+------+------+
  | COL1 | COL2   | COL3   |
  +----+------+------+
  |  1 |    2 |    3 |
  +----+------+------+
  1 row in set

  ```
 - 单表插入：包含 `RETURNING` 子句。

  ```javascript
  obclient> INSERT INTO tbl1 VALUES(1,2,3) RETURNING col1;
  +------+
  | COL1 |
  +------+
  |    1 |
  +------+
  1 row in set

  ```
 - 普通的多表插入：当表 `tbl3` 中有至少一行数据时，向表 `tbl1` 插入一行数据 (1,1,1)，向表 `tbl2` 插入一行数据 (2,2,2)。

  ```sql
  obclient> INSERT ALL INTO tbl1 VALUES(1,1,1)
                                      INTO tbl2 VALUES(2,2,2)
                  SELECT * FROM tbl3 WHERE ROWNUM< 2;
  Query OK, 2 rows affected
  Records: 2  Duplicates: 0  Warnings: 0

  obclient> SELECT * FROM tbl1;
  +------+------+------+
  | COL1 | COL2 | COL3 |
  +------+------+------+
  |    1 |    1 |    1 |
  +------+------+------+
  1 row in set

  obclient> SELECT * FROM tbl2;
  +------+------+------+
  | COL1 | COL2 | COL3 |
  +------+------+------+
  |    2 |    2 |    2 |
  +------+------+------+
  1 row in set

  ```
 - 带条件的多表插入：使用 `INSERT ALL`，当表 `tbl` 中 `col2` 的值大于 `1` 时，向表 `tbl1` 中插入数据 (1,1,1)；当表 `tbl` 中 `col3` 的值大于 `1` 时，向表 `tbl2` 中插入数据 (2,2,2)；如果都不满足，则向表 `tbl1` 中插入数据 (3,3,3)。

  ```sql
  obclient> INSERT INTO tbl VALUES(1,2,3);
  Query OK, 1 row affected

  obclient>INSERT ALL
                WHEN col2 > 1 THEN INTO tbl1 VALUES(1,1,1)
                WHEN col3 > 1 THEN INTO tbl2 VALUES(2,2,2)
                ELSE INTO tbl1 VALUES(3,3,3) SELECT col2,col3 FROM tbl;
  Query OK, 2 rows affected
  Records: 2  Duplicates: 0  Warnings: 0

  obclient> SELECT * FROM tbl1;
  +----+------+------+
  | COL1 | COL2   | COL3   |
  +----+------+------+
  |  1 |    1 |    1 |
  +----+------+------+
  1 row in set

  obclient> SELECT * FROM tbl2;
  +----+------+------+
  | COL1 | COL2   | COL3   |
  +----+------+------+
  |  2 |    2 |    2 |
  +----+------+------+
  1 row in set

  ```
 - 带条件的多表插入：使用 `INSERT FIRST`，当表 `tbl` 中 `col2` 的值大于 `1` 时，向表 `tbl1` 中插入数据 (1,1,1)，向表 `tbl2` 中插入数据 (4,4,4)；当表 `tbl` 中 `col3` 的值大于 `1` 时，向表 `tbl2` 中插入数据 (2,2,2)；如果都不满足，则向表 `tbl1` 中插入数据 (3,3,3)。

  ```sql
  obclient>INSERT INTO tbl VALUES(1,2,3);
  Query OK, 1 row affected

  obclient>INSERT ALL
                WHEN col2 > 1 THEN INTO tbl1 VALUES(1,1,1) INTO tbl2 VALUES(4,4,4)
                WHEN col3 > 1 THEN INTO tbl2 VALUES(2,2,2)
                ELSE INTO tbl1 VALUES(3,3,3) SELECT col2,col3 FROM tbl;
  Query OK, 3 rows affected
  Records: 3  Duplicates: 0  Warnings: 0

  obclient> SELECT * FROM tbl2;
  +------+------+------+
  | COL1   | COL2   | COL3   |
  +------+------+------+
  |    4 |    4 |    4 |
  |    2 |    2 |    2 |
  +------+------+------+
  2 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) 咨询热线
