首批通过分布式安全可靠测评,为关键业务系统打造
插入数据
更新时间:2026-07-15 20:56:58
表创建后,可以使用 INSERT 语句或其他语句向表中插入行记录。本文介绍了相关语句的使用方法和示例。
数据插入准备
在插入数据前,请确认以下事项:
请确认您已连接到数据库的 Oracle 租户,连接数据库的操作请参见 连接方式概述。
说明
当前登录租户所属的租户模式可以由
sys租户通过查询oceanbase.DBA_OB_TENANTS视图进行确认。请确认您已拥有待操作表的
INSERT权限,查看当前用户权限的相关操作请参见 查看用户权限。如果不具备该权限,请联系管理员为您授权,用户授权的相关操作请参见 直接授予权限。
使用 INSERT 语句插入数据
请使用 INSERT 语句,再参考下面的建议,向表中插入数据。
INSERT 语句语法格式如下:
INSERT INTO table_name (list_of_columns) VALUES (list_of_values);
| 参数 | 是否必填 | 描述 |
|---|---|---|
| table_name | 是 | 指定需要插入数据的表 |
| (list_of_columns) | 否 | 指定表中需要插入数据的列 |
| (list_of_values) | 是 | list_of_columns 提到的列的对应值,必须一一对应。 |
插入数据建议
插入数据前,建议了解表的所有列信息,包括列类型、有效值以及是否允许为 NULL 等。
查看列信息可以通过
DESC语句查看。obclient [SYS]> DESC ordr; +-------+--------------+------+-----+---------+-------+ | FIELD | TYPE | NULL | KEY | DEFAULT | EXTRA | +-------+--------------+------+-----+---------+-------+ | C1 | NUMBER | YES | NULL | NULL | NULL | | C2 | VARCHAR2(50) | YES | NULL | NULL | NULL | +-------+--------------+------+-----+---------+-------+ 2 rows in set如果列属性为
NOT NULL如果列属性有默认值,则可以在插入时不指定该列的值,系统会在该列上插入默认值。
如果列属性无默认值,则插入时必须指定该列的值。
如果列属性为
NULL,则可以在插入时不指定该列的值,系统会在该列上插入一个NULL值。
插入数据前,建议了解表上列的约束定义情况,避免插入数据时报错。
NOT NULL、PRIMARY KEY约束、UNIQUE约束均可以通过DESC语句查看,FOREIGN KEY、CHECK约束可以通过查询ALL_CONSTRAINTS、DBA_CONSTRAINTS或USER_CONSTRAINTS视图进行查看。
插入单行数据
通过 INSERT 语句可以插入单行数据。如果需要插入多条记录,可以执行多个单行插入语句来实现。如果需要批量插入,可参考 批量插入多行数据 进行操作。
假设待插入数据的表信息如下:
obclient [SYS]> CREATE TABLE t_insert(
id number NOT NULL PRIMARY KEY,
name varchar(10) NOT NULL,
value number,
gmt_create DATE NOT NULL DEFAULT sysdate
);
Query OK, 0 rows affected
其中,表的 id 列、name 列不能为空,且 id 列为主键列,满足唯一性约束要求,不能有重复的值; gmt_create 列指定了默认值。
示例 1:使用多个单行插入语句插入多行数据。
由于 gmt_create 列指定了默认值,在插入数据时可以不指定默认值。
obclient [SYS]> INSERT INTO t_insert(id, name, value)
VALUES (1,'CN',10001);
Query OK, 2 rows affected
obclient [SYS]> INSERT INTO t_insert(id, name, value)
VALUES(2,'US', 10002);
Query OK, 2 rows affected
注意,如果 gmt_create 列未指定默认值,则在插入数据时,必须指定值,语句如下。
obclient [SYS]> INSERT INTO t_insert(id, name, value, gmt_create)
VALUES (3,'EN', 10003, sysdate);
Query OK, 1 row affected
批量插入多行数据
在插入数据时,如果要插入多条记录,也可以用一个 INSERT 语句包含多个 VALUES 来批量插入。单个多行插入语句比多个单行插入语句要快。
示例 1 中的操作,又可以通过以下语句来完成。
示例 2:批量插入多行数据。
obclient [SYS]> 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 表中。
obclient [SYS]> SELECT * FROM t_insert;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 31-OCT-22 |
+----+------+-------+------------+
3 rows in set
obclient [SYS]> CREATE TABLE t_insert_bak(
id number NOT NULL PRIMARY KEY,
name varchar(10) NOT NULL,
value number,
gmt_create DATE NOT NULL DEFAULT sysdate
);
Query OK, 0 rows affected
obclient [SYS]> INSERT INTO t_insert_bak SELECT * FROM t_insert;
Query OK, 2 rows affected
Records: 3 Duplicates: 0 Warnings: 0
obclient [SYS]> SELECT * FROM t_insert_bak;
+----+------+-------+------------+
| ID | NAME | VALUE | GMT_CREATE |
+----+------+-------+------------+
| 1 | CN | 10001 | 31-OCT-22 |
| 2 | US | 10002 | 31-OCT-22 |
| 3 | EN | 10003 | 31-OCT-22 |
+----+------+-------+------------+
3 rows in set
使用 MERGE INO 语句插入数据
在批处理任务中,可能需要对目标表进行大量的 INSERT 操作。当待插入的数据在表记录中不存在时,也可以使用 MERGE INTO 语句将源表的记录插入到目标表中,具体操作及示例请参见 替换数据。
说明
在使用 INSERT 语句插入数据时,如果表上有唯一性约束,则在插入相同的记录时,系统会报错,您可以通过 MERGE INTO 语句来更新表记录,避免唯一性约束的冲突。
通过 DBLink 使用 INSERT 语句插入数据
当前 OceanBase 数据库支持通过 DBLink 向 OceanBase 数据库(Oracle 模式)和 Oracle 数据库中写入数据。
通过 DBLink 向远端数据库的表 t1 中插入一行数据 (11,11) 的示例如下:
obclient> SELECT * FROM t1@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
+------+------+
1 row in set
obclient> INSERT INTO t1@ob_dblink VALUES (11,11);
Query OK, 1 row affected
obclient> commit;
Query OK, 0 rows affected
obclient> SELECT * FROM t1@ob_dblink;
+------+------+
| C1 | C2 |
+------+------+
| 1 | 1 |
| 11 | 11 |
+------+------+
2 rows in set