OceanBase
  • 产品
  • 解决方案
  • 客户
  • 合作伙伴
  • 资源与服务
  • 文档
  • 社区
云控制台登录 / 注册
  • 免费试用
本地部署
OceanBase 分布式数据库

首批通过分布式安全可靠测评,为关键业务系统打造

OceanBase 集中式数据库

集中式架构,兼具性能与成本优势的集中式数据库

OceanBase 社区版

兼容 MySQL 的单机分布式一体化开源数据库

OceanBase seekdb

为现代 AI 应用打造的开源混合搜索数据库

云上部署
OB Cloud

一体化云数据库,打造面向多云的一致性体验

一体机
OceanBase 数据库一体机

软硬一体,提供极致性能与高可靠性保障

OceanBase AI 一体机

基于 OceanBase AI Stack 的智能一体机

工具
迁移评估工具(OMA)
数据迁移工具(OMS)
开发者工具(ODC)
运维管理工具(OCP)
自治服务工具(OAS)
一体化关键能力
TP 事务处理

面向关键业务负载的事务处理能力,保障大规模业务稳定运行与数据零丢失

AP 实时分析

原生支持事务与分析融合,低延迟洞察业务数据,驱动智能决策与敏捷运营

AI 现代负载

湖库一体管理多模态数据离在线处理,AI 原生支撑 Agent 规模化应用

oceanbase白皮书

OceanBase 一体化分布式数据库

通用场景
全场景业务系统 OLTP
实时分析混合负载
异地多活
多基础设施部署
一站式传统数据库升级
混合云部署
一库多芯软硬件混合部署
分布式数据库单机部署
大存储类数据库降本
冷数据归档降本
多实例资源整合
分库分表一体化升级
高并发场景
数据中台
行业解决方案
国有大行和股份制银行核心系统解决方案
区域性银行核心系统解决方案
寿险核心系统解决方案
产险核心系统解决方案
资管交易类系统解决方案
资管 TA 清算类系统解决方案
运营商核心系统解决方案
人社核心系统解决方案
电力核心系统解决方案
行业专区
银行专区

助力银行完成各类核心业务系统升级

保险专区

寿险、产险核心系统升级的更佳选择

零售专区

助力200+零售行业客户规模化落地

DB 大咖说
oceanbase爱奇艺

百亿级卡券业务的“单库双擎”架构升级

oceanbase四川银行

800个测试用例选定分布式数据库

oceanbase太平洋保险

先难后易,核心系统数据库升级复盘

行业案例
oceanbase交通银行

核心数据库的“分布式革命”

oceanbase中国移动

B域核心CRM&BOSS近乎零改造分布式升级

oceanbase理想

打造领先的智能制造系统和自动驾驶体验

演讲实录
oceanbase中国联通

集团应用分布式数据库覆盖B/O/M域

oceanbase国泰海通

智能推送系统稳定支撑单日亿级消息处理量

oceanbase中国联合航空

中国首款机票盲盒背后的数据库力量

用户实践
oceanbase北京银行

最快速度完成40余套系统国产数据库升级

oceanbaseVIVO

替换 MySQL 分库分表,探索成本效益最优

oceanbase滴滴

数据库大规模运维体系建设及落地实践

合作伙伴
合作伙伴类型
联合解决方案
产业生态伙伴
经销商伙伴
技术服务伙伴
培训认证伙伴
生态联合解决方案
神州信息 x OceanBase 银行核心系统
长亮科技 x OceanBase 新核心系统
中电金信 x OceanBase 金融分布式核心系统
天阳科技 x OceanBase 贷记卡方案
易诚互动 x OceanBase 手机银行方案
恒生 x OceanBase UF3.0/O45/TA/估值方案
商业发行版
云树®数据库软件 ActionDB
服务
支持与服务
提交工单
软件下载
OceanBase 企业版
OceanBase 社区版
OB Cloud
学习
培训与认证
在线课堂
在线体验
开发者
开发者中心
资料
行业报告与白皮书
官方博客
年度发布会资料
开发者大会资料
oceanbase白皮书

金融核心系统数据库升级路径与场景实践

oceanbase白皮书

人社关键业务数据库一体化升级实践

产品文档
oceanbaseOceanBase 数据库
驱动和中间件
oceanbaseOB Cloud 云数据库
工具与组件
oceanbaseOceanBase 数据库一体机
快速上手
OceanBase 数据库
OB Cloud 云数据库
知识库
汇聚常见产品使用问题案例
在线体验

Demo与实验,感受 OceanBase 的核心能力与应用场景

OceanBase 最佳实践
了解 OceanBase 分布式数据库的架构与系统原理
技术博客

技术解析 | 用户实践 | 社区月报

在线课堂

电子书 |视频课程|在线培训

Developer Hub
应用开发Demo | 数据开发与集成工具
问答论坛

快速答疑 | 常见问题 | 技术交流

社区活动

Meetup | 技术公开课

GitHub

查看源码 | 贡献代码 | 建议反馈

加入社区

社区组织 | 社区用户贡献 |开发者贡献

进入社区首页
oceanbase数据库大赛

第五届OceanBase数据库大赛

oceanbase免费课程
从故障处理到性能调优:OceanBase资深DBA进阶培训
切换语言
  • 中文站 - 简体中文
  • International - English
  • 日本站 - 日本語
文档反馈
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V4.3.2
  5. 参考指南
  6. SQL 参考
  7. SQL 语法
  8. 普通租户(Oracle 模式)
  9. SQL 语句
  10. DML
  11. INSERT
分布式版-V4.3.2
  • What's New
  • 简介
  • 快速上手
  • 应用开发
  • 部署数据库
  • 数据迁移
  • 管理数据库
  • AP
  • 生态集成
  • 参考指南
    • 系统原理
    • 系统管理
    • 数据库对象管理
    • 数据库设计规范和约束
    • SQL 参考
      • SQL 语法
        • 系统租户
        • 普通租户(MySQL 模式)
        • 普通租户(Oracle 模式)
          • SQL 概述
          • 伪列
          • 基本元素
          • 运算符
          • 函数
          • 表达式
          • 条件
          • 查询和子查询
          • SQL 语句
            • DDL
            • DML
              • DELETE
              • INSERT
              • MERGE
              • PURGE
              • EXPLAIN
              • SELECT
              • UPDATE
            • DCL
          • DDL 功能
      • SQL 实践和建议
      • PL 参考
      • 预留关键字(MySQL 模式)
      • 预留关键字(Oracle 模式)
    • 系统视图
    • 配置项和系统变量
    • 错误码
    • 性能调优
    • 性能测试
    • 数据库代理
    • 驱动
    • 平台产品
    • 组件 & 工具
  • 常见问题
  • 版本发布记录
  • 术语
  1. 文档中心
  2. OceanBase 数据库
  3. 分布式版
  4. V4.3.2
  5. 参考指南
  6. SQL 参考
  7. SQL 语法
  8. 普通租户(Oracle 模式)
  9. SQL 语句
  10. DML
  11. INSERT

INSERT

更新时间:2025-02-12 13:41:20

github-fill编辑
编组分享

描述

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

权限要求

执行 INSERT 语句需要当前用户拥有 INSERT 的系统权限。有关 OceanBase 数据库权限的详细介绍,请参见 Oracle 模式下的权限分类。

语法

INSERT [hint_options] { single_table_insert | multi_table_insert | overwrite_table_insert};

single_table_insert:
    { INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } '(' column_list ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    | INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } '(' ')' values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    | INTO insert_table_clause { NOLOGGING | /*EMPTY*/ } values_clause [{ RETURNING | RETURN } returning_exprs [into_clause]]
    }

hint_options:
    [/*+ [APPEND | DIRECT(bool, int, load_mode)] enable_parallel_dml PARALLEL(N) | NO_DIRECT */]
    [INTO] table_name [PARTITION(PARTITION_OPTION)]

column_list:  
      column_definition_ref [, column_definition_ref...]

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 } ]...  )

returning_exprs:
    projection_col_name [,projection_col_name ...]

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 } ]

overwrite_table_insert:
    [/*+PARALLEL(N)*/] OVERWRITE table_name [(list_of_columns)] [PARTITION (partition_name, ...)] select_stmt

参数解释

参数 描述
hint_options 使用 Hint 启用旁路导入功能,可选项。更多使用 Hint 信息,参见 Hint 概述。

注意

在执行旁路导入任务的过程中,不建议同时进行 OceanBase 数据库的升级操作,因为这可能导致旁路导入任务失败。

INSERT INTO SELECT 语句支持通过 APPEND \| DIRECT()\| NO_DIRECT Hint 控制数据的导入方式,格式为 /*+ [APPEND \| DIRECT(bool, int, load_mode)] enable_parallel_dml PARALLEL(N) \| NO_DIRECT */。Hint 中各参数解释如下:
  • APPEND:默认等同于使用的 DIRECT(true, 0),同时可以实现在线收集统计信息(GATHER_OPTIMIZER_STATISTICS Hint)的功能。
  • DIRECT():
    • bool:表示写入的数据是否需要排序,true 表示需要排序,false 表示不需要排序。
    • int:表示最大容忍的错误行数。
    • load_mode:可选参数,表示旁路导入的模式。取值须使用英文单引号包起来,取值如下:
      • full:默认值,表示全量导入。
      • inc:表示增量导入,支持 INSERT 和 IGNORE 语义。
      • inc_replace:表示增量导入,但不检查主键是否重复,相当于 REPLACE 语义的增量导入。
    • enable_parallel_dml parallel(N):加载数据的并行度,N 默认为 4。

      说明

      一般情况下,enable_parallel_dml Hint 和 parallel Hint 必须配合使用才能开启并行 DML。不过,当目标表的 Schema 上指定了表级别的并行度时,仅需指定 enable_parallel_dml Hint。

  • NO_DIRECT:控制单条 SQL 强制不走旁路导入,只要输入的 SQL 带有该 Hint,则整个语句忽略其他旁路导入的 Hint,执行普通导入。
更多使用 INSERT INTO SELECT 旁路导入的信息,参见 使用 INSERT INTO SELECT 语句旁路导入数据。
table_name 导入数据的表的名称,支持指定表任意列数目。
PARTITION_OPTION 指定分区旁路导入时的分区名:
  • partition_option_list:一级分区列表,同时插入多个分区时以逗号(,)分隔。
  • subpartition_option_list:二级分区列表,同时插入多个分区时以逗号(,)分隔。
single_table_insert 单表插入。
insert_table_clause 指定的插入的表,可以是基表、可更新视图、特殊子查询。

注意

特殊子查询是指类似于可更新视图对应的子查询,这类子查询不应该包含复杂的算子(例如 GROUP BY、DISTINCT、WINDOW FUNCTION 等)。

opt_nologging 尽量减少插入时的日志信息。
column_list 指定要插入的列名。
returning_exprs 返回插入数据之后的投影列。
insert_into_clause 将插入数据之后的列值插入到指定列表中。
multi_table_insert 多表插入。
conditional_insert_clause 带条件的多表插入。
  • ALL:遍历所有匹配条件的分支,只要满足条件就会将数据插入对应的表。
  • FIRST:找到第一个满足条件的分支后,将数据插入该分支对应的表,不会再继续检查剩余分支的条件是否满足。
error_logging_clause 将 SQL 错误和受影响的行数列中的值保存在一个错误记录表。
overwrite_table_insert 用于将查询结果替换表或分区中的现有数据。有关使用 INSERT OVERWRITE SELECT 语句的详细信息,参见 插入数据 中的 使用 INSERT OVERWRITE SELECT 语句插入数据 章节。
list_of_columns 指定表中需要插入数据的列。
select_stmt 指定 SELECT 子句。有关查询语句的详细信息,参见 SIMPLE SELECT。

示例

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

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

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

obclient> CREATE TABLE tbl3(col1 INT PRIMARY KEY, col2 INT,col3 INT);
Query OK, 0 rows affected
  • 单表插入:向表 tbl1 中插入两行数据。

    obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (1, 10, 100), (2, 20, 200);
    Query OK, 2 row affected
    
    obclient> SELECT * FROM tbl1;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |    1 |   10 |  100 |
    |    2 |   20 |  200 |
    +------+------+------+
    2 rows in set
    
  • 单表插入:直接向子查询中插入数据。

    obclient>INSERT INTO tbl1 (col1, col2, col3) SELECT col1 + 2, col2 + 5, col3 + 10 FROM tbl1;
    Query OK, 2 row affected
    
    obclient> SELECT * FROM tbl1;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |    1 |   10 |  100 |
    |    2 |   20 |  200 |
    |    3 |   15 |  110 |
    |    4 |   25 |  210 |
    +------+------+------+
    4 rows in set
    
  • 单表插入:包含 RETURNING 子句。

    obclient> INSERT INTO tbl1 (col1, col2, col3) VALUES (5, 50, 500), (6, 60, 600) RETURNING col1;
    +------+
    | COL1 |
    +------+
    |    5 |
    |    6 |
    +------+
    2 rows in set
    
    obclient> SELECT * FROM tbl1;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |    1 |   10 |  100 |
    |    2 |   20 |  200 |
    |    3 |   15 |  110 |
    |    4 |   25 |  210 |
    |    5 |   50 |  500 |
    |    6 |   60 |  600 |
    +------+------+------+
    6 rows in set
    
  • 普通的多表插入:当表 tbl3 中有至少一行数据时,向表 tbl1 插入一行数据 (7,8,9),向表 tbl2 插入一行数据 (10,11,12)。

    obclient> INSERT ALL INTO tbl1 VALUES(7,8,9)
                                        INTO tbl2 VALUES(10,11,12)
                    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 |   10 |  100 |
    |    2 |   20 |  200 |
    |    3 |   15 |  110 |
    |    4 |   25 |  210 |
    |    5 |   50 |  500 |
    |    6 |   60 |  600 |
    |    7 |    8 |    9 |
    +------+------+------+
    7 rows in set
    
    obclient> SELECT * FROM tbl2;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |   10 |   11 |   12 |
    +------+------+------+
    1 row in set
    
  • 带条件的多表插入:使用 INSERT ALL,当表 tbl 中 col2 的值大于 1 时,向表 tbl1 中插入数据 (10,11,12);当表 tbl 中 col3 的值大于 1 时,向表 tbl2 中插入数据 (22,23,24);如果都不满足,则向表 tbl1 中插入数据 (33,34,35)。

    obclient> INSERT INTO tbl VALUES(1,2,3);
    Query OK, 1 row affected
    
    obclient>INSERT ALL
                  WHEN col2 > 1 THEN INTO tbl1 VALUES(10,11,12)
                  WHEN col3 > 1 THEN INTO tbl2 VALUES(22,23,24)
                  ELSE INTO tbl1 VALUES(33,34,35) SELECT col2,col3 FROM tbl;
    Query OK, 2 rows affected
    Records: 2  Duplicates: 0  Warnings: 0
    
    obclient> SELECT * FROM tbl1;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |    1 |   10 |  100 |
    |    2 |   20 |  200 |
    |    3 |   15 |  110 |
    |    4 |   25 |  210 |
    |    5 |   50 |  500 |
    |    6 |   60 |  600 |
    |    7 |    8 |    9 |
    |   10 |   11 |   12 |
    +------+------+------+
    8 rows in set
    
    obclient> SELECT * FROM tbl2;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |   10 |   11 |   12 |
    |   22 |   23 |   24 |
    +------+------+------+
    2 rows in set
    
  • 带条件的多表插入:使用 INSERT FIRST,当表 tbl 中 col2 的值大于 1 时,向表 tbl1 中插入数据 (14,15,16),向表 tbl2 中插入数据 (40,41,42);当表 tbl 中 col3 的值大于 1 时,向表 tbl2 中插入数据 (25,26,27);如果都不满足,则向表 tbl1 中插入数据 (35,36,37)。

    obclient>INSERT ALL
                  WHEN col2 > 1 THEN INTO tbl1 VALUES(14,15,16) INTO tbl2 VALUES(40,41,42)
                  WHEN col3 > 1 THEN INTO tbl2 VALUES(25,26,27)
                  ELSE INTO tbl1 VALUES(35,36,37) SELECT col2,col3 FROM tbl;
    Query OK, 3 rows affected
    Records: 3  Duplicates: 0  Warnings: 0
    
    obclient> SELECT * FROM tbl1;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |    1 |   10 |  100 |
    |    2 |   20 |  200 |
    |    3 |   15 |  110 |
    |    4 |   25 |  210 |
    |    5 |   50 |  500 |
    |    6 |   60 |  600 |
    |    7 |    8 |    9 |
    |   10 |   11 |   12 |
    |   14 |   15 |   16 |
    +------+------+------+
    9 rows in set
    
    obclient> SELECT * FROM tbl2;
    +------+------+------+
    | COL1 | COL2 | COL3 |
    +------+------+------+
    |   10 |   11 |   12 |
    |   22 |   23 |   24 |
    |   25 |   26 |   27 |
    |   40 |   41 |   42 |
    +------+------+------+
    4 rows in set
    
  • 通过 direct Hint 的 load_mode 参数来指定增量旁路导入。

    obclient [SYS]> INSERT /*+ direct(true, 0, 'inc_replace') enable_parallel_dml parallel(2) */ INTO tbl2 SELECT * FROM tbl1;
    

    返回结果如下:

    Query OK, 8 rows affected
    Records: 8  Duplicates: 0  Warnings: 0
    

相关文档

  • 插入数据
  • 使用 INSERT INTO SELECT 语句旁路导入数据
  • SIMPLE SELECT

本文目录

描述权限要求语法参数解释示例相关文档
有帮助
无帮助
反馈
AI

OceanBase

OceanBase 海扬数据库始创于 2010 年,是完全自主研发的数据库公司。2020年开始独立商业化运作,历经15年大规模核心场景验证,目前是中国数据库的领军企业之一。从分布式数据库到 AI 数据库,为企业提供安全、稳定、可扩展的数据底座,推动数据基础设施全面拥抱 AI 时代。

关于我们

关于 OceanBase最新动态资质荣誉客户专家委员会招贤纳士合作伙伴年度发布会开发者大会

资源与服务

支持与服务文档知识库软件与工具下载培训与认证在线体验数据库专题视频

社区

快速上手开发者中心博客活动学习问答GitHub

数据库百科

分布式数据库国产数据库OLTP 数据库OLAP 数据库HTAP 数据库数据库向量数据库向量检索

联系我们

服务热线:
400-109-0633
商务咨询
培训认证技术支持媒体合作
京公网安备11010802047223号京公网安备11010802047223号
京ICP备20024574号-1
合字B1.B2-20250395
网站服务协议隐私协议安全响应协议
OceanBase 版权所有 © 2026 基础资源和备案服务由阿里云提供