---
title: "插入数据 - OceanBase 数据库 V4.2.0 | OceanBase 文档中心"
description: 插入数据 表创建后，可以使用 INSERT 语句或其他语句向表中插入行记录。本文介绍了相关语句的使用方法和示例。 数据插入准备 在插入数据前，请确认以下事项： 请确认您已连接到数据库的 MySQL 租户，连接数据库的操作请参见 连接方式概述 。 说明 当前登录租户所属的租户模式可以由 sys 租户通过查询 ocean…
---
切换语言

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

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

# 插入数据

更新时间：2024-08-01 16:31:48

[编辑](https://github.com/oceanbase/oceanbase-doc/edit/V4.2.0/zh-CN/300.develop/100.application-development-of-mysql-mode/400.write-data-of-mysql-mode/100.insert-data-of-mysql-mode-in-develop.md)  

表创建后，可以使用 `INSERT` 语句或其他语句向表中插入行记录。本文介绍了相关语句的使用方法和示例。

## 数据插入准备

在插入数据前，请确认以下事项：

- 请确认您已连接到数据库的 MySQL 租户，连接数据库的操作请参见 [连接方式概述](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033606)。

  #### 说明

  当前登录租户所属的租户模式可以由 `sys` 租户通过查询 `oceanbase.DBA_OB_TENANTS` 视图进行确认。
 - 请确认您已拥有待操作的表的 `INSERT` 权限，查看当前用户权限的相关操作请参见 [查看用户权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000035619)。如果不具备该权限，请联系管理员为您授权，用户授权的相关操作请参见 [修改用户权限](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000035613)。

## 使用 INSERT 语句插入数据

请使用 [INSERT](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000036144) 语句，再参考下面的建议，向表中插入数据。

`INSERT` 语句的语法格式如下：

```sql
INSERT INTO table_name (list_of_columns) VALUES (list_of_values);

```

| 参数 | 是否必填 | 描述 |
| --- | --- | --- |
| table_name | 是 | 指定需要插入数据的表 |
| (list_of_columns) | 否 | 指定表中需要插入数据的列 |
| (list_of_values) | 是 | list_of_columns 提到的列的对应值，必须一一对应。 |

### 插入数据建议

- 插入数据前，建议了解表的所有列信息，包括列类型、有效值以及是否允许为 NULL 等。

  查看列信息可以通过 `DESC` 语句查看。

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

  ```

     - 如果列属性为 `NOT NULL`

           - 如果列属性有默认值，则可以在插入时不指定该列的值，系统会在该列上插入默认值。
           - 如果列属性无默认值，则插入时必须指定该列的值。
     - 如果列属性为 `NULL`，则可以在插入时不指定该列的值，系统会在该列上插入一个 `NULL` 值。
 - 插入数据前，建议了解表上列的约束定义情况，避免插入数据时报错。

  `NOT NULL`、`PRIMARY KEY` 约束、`UNIQUE` 约束均可以通过 `DESC` 语句查看，`FOREIGN KEY`、`CHECK` 约束可以通过查询 `information_schema.TABLE_CONSTRAINTS` 视图进行查看。

### 插入单行数据

通过 `INSERT` 语句可以插入单行数据。如果需要插入多条记录，可以执行多个单行插入语句来实现。如果需要批量插入，可参考 [批量插入多行数据](#批量插入多行数据) 进行操作。

假设待插入数据的表信息如下：

```sql
obclient [test]> CREATE TABLE t_insert(
    id int NOT NULL PRIMARY KEY,
    name varchar(10) NOT NULL,
    value int,
    gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
Query OK, 0 rows affected

```

其中，表的 `id` 列、`name` 列不能为空，且 `id` 列为主键列，满足唯一性约束要求，不能有重复的值； `gmt_create` 列指定了默认值。

示例 1：使用多个单行插入语句插入多行数据。

由于 `gmt_create` 列指定了默认值，在插入数据时可以不指定默认值。

```sql
obclient [test]> INSERT INTO t_insert(id, name, value)
VALUES (1,'CN',10001);
Query OK, 2 rows affected

obclient [test]> INSERT INTO t_insert(id, name, value)
VALUES(2,'US', 10002);
Query OK, 2 rows affected

```

注意，如果 `gmt_create` 列未指定默认值，则在插入数据时，必须指定值，语句如下。

```sql
obclient [test]> INSERT INTO t_insert(id, name, value, gmt_create)
 VALUES (3,'EN', 10003, current_timestamp ());
Query OK, 1 row affected

```

### 批量插入多行数据

在插入数据时，如果要插入多条记录，也可以用一个 `INSERT` 语句包含多个 `VALUES` 来批量插入。单个多行插入语句比多个单行插入语句要快。

示例 1 中的操作，又可以通过以下语句来完成。

示例 2：批量插入多行数据。

```sql
obclient [test]> INSERT INTO t_insert(id, name, value)
  VALUES (1,'CN',10001),(2,'US', 10002);
Query OK, 2 rows affected

```

此外，当需要备份表数据或者将一个表的全部记录拷贝到另一个表时，可以使用查询语句 `INSERT INTO ... SELECT ... FROM` 充当 `INSERT` 的 `values` 子句进行批量插入。

示例 3：将表 `t_insert` 中的全部数据备份到 `t_insert_bak` 表中。

```sql
obclient [test]> SELECT * FROM t_insert;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-10-12 15:17:17 |
|  2 | US   | 10002 | 2022-10-12 16:29:16 |
|  3 | EN   | 10003 | 2022-10-12 16:29:26 |
+----+------+-------+---------------------+
3 rows in set

obclient [test]> CREATE TABLE t_insert_bak(
    id number NOT NULL PRIMARY KEY,
    name varchar(10) NOT NULL,
    value number,
    gmt_create DATETIME NOT NULL DEFAULT CURRENT_TIMESTAMP
 );
Query OK, 0 rows affected

obclient [test]> INSERT INTO t_insert_bak SELECT * FROM t_insert;
Query OK, 2 rows affected

obclient [test]> SELECT * FROM t_insert_bak;
+----+------+-------+---------------------+
| id | name | value | gmt_create          |
+----+------+-------+---------------------+
|  1 | CN   | 10001 | 2022-10-12 15:17:17 |
|  2 | US   | 10002 | 2022-10-12 16:29:16 |
|  3 | EN   | 10003 | 2022-10-12 16:29:26 |
+----+------+-------+---------------------+
3 rows in set

```

### 避免唯一性约束冲突

当表上有唯一性约束的时候，插入相同的记录，数据库会报错。报错信息如下：

```sql
obclient [test]> INSERT INTO t_insert(id, name, value) VALUES (3,'UK', 10003),(4, 'JP', 10004);
ERROR 1062 (23000): Duplicate entry '3' for key 'PRIMARY'

```

该报错可以通过 `INSERT IGNORE INTO` 语句或 `INSERT INTO ON DUPLICATE KEY UPDATE` 语句来避免。

示例：

- 通过 [`INSERT IGNORE INTO`](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000036144) 语句避免约束冲突时，`IGNORE` 关键字可以忽略由于约束冲突导致的 `INSERT` 失败的影响。

  ```sql
  obclient [test]> INSERT IGNORE INTO t_insert(id, name, value)
      VALUES (3,'UK', 10003),(4, 'JP', 10004);
  Query OK, 1 row affected

  obclient [test]> SELECT * FROM t_insert;
  +----+------+-------+---------------------+
  | id | name | value | gmt_create          |
  +----+------+-------+---------------------+
  |  1 | CN   | 10001 | 2022-10-12 15:17:17 |
  |  2 | US   | 10002 | 2022-10-12 16:29:16 |
  |  3 | EN   | 10003 | 2022-10-12 16:29:26 |
  |  4 | JP   | 10004 | 2022-10-12 17:02:52 |
  +----+------+-------+---------------------+
  4 rows in set

  ```

  示例中，使用了 `INSERT IGNORE INTO` 语句，`(3,'UK', 10003)` 这一行数据插入失败，但系统未再报错。
 - 通过 [`INSERT INTO ON DUPLICATE KEY UPDATE`](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000036144) 语句避免约束冲突时，可以指定对重复主键或唯一键的后续处理。

  #### 说明

     - 指定 `ON DUPLICATE KEY UPDATE column_name = expr `：当要插入的主键或唯一键有重复时，可以使用 `column_name = expr ` 赋值语句来更新表中冲突行的数据。 `column_name = expr ` 赋值语句可以为冲突行赋某一列或几列的值。赋多列值时，列与列之间用逗号分隔。
     - 不指定 `ON DUPLICATE KEY UPDATE column_name = expr `：当要插入的主键或唯一键有重复时，插入数据时，系统会报错。

  ```sql
  obclient [test]> INSERT INTO t_insert(id, name, value) VALUES (3,'UK', 10003),(5, 'CN', 10005) ON DUPLICATE KEY UPDATE name = VALUES(name);
  Query OK, 1 row affected

  obclient [test]> SELECT * FROM t_insert;
  +----+------+-------+---------------------+
  | id | name | value | gmt_create          |
  +----+------+-------+---------------------+
  |  1 | CN   | 10001 | 2022-10-12 16:29:16 |
  |  2 | US   | 10002 | 2022-10-12 15:17:17 |
  |  3 | UK   | 10003 | 2022-10-12 16:29:26 |
  |  4 | JP   | 10004 | 2022-10-12 17:02:52 |
  |  5 | CN   | 10005 | 2022-10-12 17:27:46 |
  +----+------+-------+---------------------+
  5 rows in set

  ```

  示例中，`ON DUPLICATE KEY UPDATE name = VALUES(name)` 即表示当插入的数据与表中的主键值有重复时，将表中冲突行原数据中 `(3,'EN', 10003)` 的 `name` 列的值更新为当前待插入的 `name` 列的数据。其他不冲突的行，则正常插入。

## 使用其他语句插入数据

除了 `INSERT` 语句，当表中无数据记录，或者表中有数据记录但无主键或唯一键冲突时，还可以使用 `REPLACE INTO` 语句代替 `INSERT` 语句插入数据。`REPLACE INTO` 语句的详细语法及说明请参见 [REPLACE](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000036143)。

示例：

- 创建 `t_replace` 表后，使用 `REPLACE INTO` 语句插入数据。

  ```sql
  obclient [test]> CREATE TABLE t_replace(
      id int NOT NULL PRIMARY KEY
      , name varchar(10) NOT NULL
      , value int
      ,gmt_create timestamp NOT NULL DEFAULT current_timestamp
  );
  Query OK, 0 rows affected

  obclient [test]> REPLACE INTO t_replace VALUES(1,'CN',2001, current_timestamp ());
  Query OK, 1 row affected

  obclient [test]> SELECT * FROM t_replace;
  +----+------+-------+---------------------+
  | id | name | value | gmt_create          |
  +----+------+-------+---------------------+
  |  1 | CN   |  2001 | 2022-11-23 09:52:44 |
  +----+------+-------+---------------------+
  1 row in set

  ```
 - 在有数据记录的表 `t_replace` 中，使用 `REPLACE INTO` 语句插入数据。

  ```sql
  obclient [test]> SELECT * FROM t_replace;
  +----+------+-------+---------------------+
  | id | name | value | gmt_create          |
  +----+------+-------+---------------------+
  |  1 | CN   |  2001 | 2022-03-22 16:13:55 |
  +----+------+-------+---------------------+
  1 row in set

  obclient [test]> REPLACE INTO t_replace values(2,'US',2002, current_timestamp ());
  Query OK, 1 row affected

  obclient [test]> SELECT * FROM t_replace;
  +----+------+-------+---------------------+
  | id | name | value | gmt_create          |
  +----+------+-------+---------------------+
  |  1 | CN   |  2001 | 2022-11-23 09:52:44 |
  |  2 | US   |  2002 | 2022-11-23 09:53:05 |
  +----+------+-------+---------------------+
  2 rows in set

  ```

## 相关文档

- [更新数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033592)
 - [删除数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033595)
 - [替换数据](https://www.oceanbase.com/docs/common-oceanbase-database-cn-1000000000033593)

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