`

INSERT ALL和INSERT FIRST语法

阅读更多

转自:http://yangtingkun.itpub.net/post/468/27038

 

INSERT ALL和INSERT FIRST语法
===========================================================

在数据仓库中的转换和装载过程中,可能会使用INSERT ALL语句,这篇文章简单介绍一下INSERT ALL语句。

 

 

 

 

INSERT ALL是9i新增的语法,它扩充了原有的INSERT语句,使得INSERT语句从原来的只能插入到一张表发展到可以同时插入多张表,还可以根据判断条件来决定每条记录插入到哪张或哪几张表中。

 

下面看几个简单的例子:

 

SQL> CREATE TABLE TABLE_STORAGE
  2  (
  3  TABLE_NAME VARCHAR2(30),
  4  TABLESPACE_NAME VARCHAR2(30),
  5  PCT_FREE NUMBER,
  6  PCT_USED NUMBER,
  7  INI_TRANS NUMBER,
  8  MAX_TRANS NUMBER,
  9  INITIAL_EXTENT NUMBER,
 10  NEXT_EXTENT NUMBER,
 11  MIN_EXTENTS NUMBER,
 12  MAX_EXTENTS NUMBER,
 13  PCT_INCREASE NUMBER,
 14  FREELISTS NUMBER,
 15  FREELIST_GROUPS NUMBER
 16  );

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE TABLE_STAT
  2  (
  3  TABLE_NAME VARCHAR2(30),
  4  NUM_ROWS NUMBER,
  5  BLOCKS NUMBER,
  6  EMPTY_BLOCKS NUMBER,
  7  AVG_SPACE NUMBER,
  8  CHAIN_CNT NUMBER,
  9  AVG_ROW_LEN NUMBER
 10  );

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  INTO TABLE_STORAGE VALUES (TABLE_NAME, TABLESPACE_NAME, PCT_FREE, PCT_USED,
  3  INI_TRANS, MAX_TRANS, INITIAL_EXTENT, NEXT_EXTENT, MIN_EXTENTS, MAX_EXTENTS,
  4  PCT_INCREASE, FREELISTS, FREELIST_GROUPS)
  5  INTO TABLE_STAT VALUES (TABLE_NAME, NUM_ROWS, BLOCKS, EMPTY_BLOCKS, AVG_SPACE,
  6  CHAIN_CNT, AVG_ROW_LEN)
  7  SELECT * FROM USER_TABLES;

 

 

 

已创建

54行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_STORAGE;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM TABLE_STAT;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM USER_TABLES;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> DROP TABLE TABLE_STAT;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE TABLE_STORAGE;

 

 

 

表已丢弃。

 

 

 

上面是最简单的INSERT ALL语句的实现,下面看看带条件的INSERT ALL语句。

 

SQL> CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE INDEX_ALL (INDEX_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE OBJECT_OTHER (OBJECT_NAME VARCHAR2(30), OBJECT_TYPE VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  WHEN (OBJECT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (OBJECT_NAME)
  4  WHEN (OBJECT_TYPE = 'INDEX') THEN
  5  INTO INDEX_ALL VALUES (OBJECT_NAME)
  6  ELSE
  7  INTO OBJECT_OTHER
  8  SELECT OBJECT_NAME, OBJECT_TYPE FROM USER_OBJECTS
  9  ;

 

 

 

已创建

91行。

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS WHERE OBJECT_TYPE = 'INDEX';

 

 

 

  COUNT(*)
----------
        14

 

 

 

SQL> SELECT COUNT(*) FROM USER_OBJECTS
  2  WHERE OBJECT_TYPE NOT IN ('TABLE', 'INDEX');

 

 

 

  COUNT(*)
----------
        50

 

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        27

 

 

 

SQL> SELECT COUNT(*) FROM INDEX_ALL;

 

 

 

  COUNT(*)
----------
        14

 

 

 

SQL> SELECT COUNT(*) FROM OBJECT_OTHER;

 

 

 

  COUNT(*)
----------
        50

 

 

 

SQL> DROP TABLE TABLE_ALL;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE INDEX_ALL;

 

 

 

表已丢弃。

 

 

 

SQL> DROP TABLE OBJECT_OTHER;

 

 

 

表已丢弃。

 

 

 

下面看一下INSERT ALL和INSERT FIRST的区别:

 

SQL> CREATE TABLE TABLESPACE_USERS (NAME VARCHAR2(30), TYPE VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> CREATE TABLE TABLE_ALL (TABLE_NAME VARCHAR2(30));

 

 

 

表已创建。

 

 

 

SQL> INSERT ALL
  2  WHEN (SEGMENT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (SEGMENT_NAME)
  4  WHEN (TABLESPACE_NAME = 'USERS') THEN
  5  INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)
  6  SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME
  7  FROM USER_SEGMENTS;

 

 

 

已创建

69行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        21

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS;

 

 

 

  COUNT(*)
----------
        48

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
        18

 

 

 

SQL> TRUNCATE TABLE TABLE_ALL;

 

 

 

表已截掉。

 

 

 

SQL> TRUNCATE TABLE TABLESPACE_USERS;

 

 

 

表已截掉。

 

 

 

SQL> INSERT FIRST
  2  WHEN (SEGMENT_TYPE = 'TABLE') THEN
  3  INTO TABLE_ALL VALUES (SEGMENT_NAME)
  4  WHEN (TABLESPACE_NAME = 'USERS') THEN
  5  INTO TABLESPACE_USERS VALUES (SEGMENT_NAME, SEGMENT_TYPE)
  6  SELECT SEGMENT_NAME, SEGMENT_TYPE, TABLESPACE_NAME
  7  FROM USER_SEGMENTS;

 

 

 

已创建

51行。

 

 

SQL> SELECT COUNT(*) FROM TABLE_ALL;

 

 

 

  COUNT(*)
----------
        21

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS;

 

 

 

  COUNT(*)
----------
        30

 

 

 

SQL> SELECT COUNT(*) FROM TABLESPACE_USERS WHERE TYPE = 'TABLE';

 

 

 

  COUNT(*)
----------
         0

 

 

 

最后看一下多表插入语句的限制条件:

 

只能对表执行多表插入语句,不能对视图或物化视图执行;

 

不能对远端表执行多表插入语句;

 

不能使用表集合表达式;

 

不能超过999个目标列;

 

RAC环境中或目标表是索引组织表或目标表上建有BITMAP索引时,多表插入语句不能并行执行;

 

多表插入语句不支持执行计划稳定性;

 

多表插入语句中的子查询不能使用序列。

 

 

INSERT ALL和INSERT FIRST语句的差别:

其实你对比INSERT ALL和INSERT FIRST语句的例子仔细观察,就会明白这个例子的含义,两个SQL语句唯一的差别就是ALL和FIRST的差别,其余部分完成一样。
对于INSERT ALL,插入第一张表的数据,如果满足第二张表的条件,也会插入。
而INSERT FIRST不然,满足第一条插入条件的数据是不会进行随后的判断的,所以在INSERT FIRST执行后,在TABLESPACE_USERS表中看不到SEGMENT_TYPE为TABLE的记录

分享到:
评论

相关推荐

    PostgreSQL多表插入(兼容oracle insert all)

    在oracle中我们可以使用insert all或者insert first语句,两者语法基本一致,区别在于: insert first:对于每一行数据,只插入到第一个when条件成立的表,不继续检查其他条件。 insert all :对于每一行数据,对每...

    bulk insert 文本文件数据导入

    首先,`BULK INSERT`的基本语法如下: ```sql BULK INSERT FROM '<data_file>' WITH ( [ BATCHSIZE = batch_size ] [ , CODEPAGE = { 'ACP' | 'OEM' | 'RAW' | code_page } ] [ , DATAFILETYPE = { 'char' | '...

    Insert,Select,Update和Delete。

    INSERT INTO EMPLOYEES (LAST_NAME, FIRST_NAME, HIRE_DATE, BRANCH_OFFICE, DEPARTMENT_ID, SALARY) VALUES ('Smith', 'John', '1980-06-10', 'Los Angeles', 16, 45000); ``` 这条语句将新员工的信息插入到`...

    SQL SERVER BULK INSERT用法

    下面是 BULK INSERT 的详细用法和参数解释: 基本语法 BULK INSERT [ [ 'database_name'.][ 'owner' ].]{ 'table_name' FROM 'data_file' } [ WITH ( [ BATCHSIZE [ = batch_size ] ] [ , ... ] ) ] 参数解释 * ...

    SQL写法—数据修改

    本文将详细介绍如何利用Oracle数据库中的条件 `INSERT ALL` 和 `INSERT FIRST` 语句进行高效的数据插入操作,并通过具体的例子来说明这两种方法的使用场景及注意事项。 #### 一、条件 INSERT ALL 条件 `INSERT ALL...

    First集合的一种实现

    rule.leftSide->firstSet.insert(symbol->firstSet.begin(), symbol->firstSet.end()); } } ``` 在这个实现中,`nonTerminals` 是一个映射,用于存储所有非终结符及其对应的First集合。`GrammarRule` 的 `right...

    SQL基本语法知识

    例如,描述中的"Persons"表,包含ID、Last Name、First Name、Address和City等字段,用于存储人员信息。每行代表一个独立的记录,而每一列则表示特定的属性。 SQL语句是与数据库交互的语言。基础的SQL语句包括: 1...

    Les20_chinese(Oracle公司内部数据库培训资料).pptx

    多表插入有四种类型:无条件的INSERT、有条件的ALL INSERT、有条件的FIRST INSERT和旋转INSERT。 1. **无条件的INSERT ALL**:在满足特定条件时,向所有指定的表中插入数据。例如: ```sql INSERT ALL INTO sal...

    head first python 入门代码教程

    列表是最常用的一种,支持索引、切片和多种操作,如append()、insert()等。元组是不可变的列表,常用于返回多个值或作为字典的键。字典是键值对的集合,提供了高效的查找和修改功能。集合则是一组互不相同的元素,常...

    SQL 语法 SQL 总结 SQL教程

    SQL 语法 SQL select SQL distinct SQL where SQL AND & OR SQL Order By SQL insert SQL update SQL delete SQL 高级 SQL Top SQL Like SQL 通配符 SQL In SQL Between SQL Aliases SQL Join SQL ...

    oracle SQL语法大全.rar

    1. 分页查询:ROWNUM伪列和FETCH FIRST / OFFSET用于实现数据分页。 2. 子查询优化:使用EXISTS或IN代替子查询,提高查询效率。 3. 视图:CREATE VIEW创建虚拟表,简化复杂的查询。 4. 游标:在PL/SQL中处理单行或...

    sql基础语法考试必备小抄

    ### SQL基础语法考试必备知识点 #### 一、SQL简介 SQL(Structured Query Language)是一种用于管理关系数据库的标准语言。它提供了强大的数据操作能力,包括数据查询、数据定义、数据操纵和数据控制等功能。 ####...

    Head First SQL 中文版

    3. SQL语法:SQL主要包括四大语句:SELECT(查询)、INSERT(插入)、UPDATE(更新)和DELETE(删除)。《Head First SQL》将详细解释这些语句的使用方法,如何查询、添加、修改和删除数据库中的数据。 4. SELECT...

    MySQL语法语句大全MySQL语法语句大全

    MySQL是一种广泛使用的开源...以上就是MySQL语法语句的基本框架,每个部分都有许多细分的细节和用法,需要通过实际操作和学习来深入了解和掌握。实践中,根据业务需求灵活运用这些语句,可以实现高效的数据管理和处理。

    Head First PHP&MySQL;(中文版)

    在《Head First PHP&MySQL》中,读者将学习如何创建、查询和管理数据库,包括数据表的创建、数据操作语言(DML)如INSERT、UPDATE和DELETE,以及数据查询语言(DQL)中的SELECT语句。还将讨论数据库设计的基本原则,...

    实验二 First集的生成

    1. **掌握First集的概念及其生成规则:**通过给定的形式文法规则,理解和掌握如何生成每个非终结符的First集。 2. **使用C++实现First集的生成算法:**利用Visual Studio 2015等工具,编写代码实现First集的计算功能...

    oracle语法大全

    根据给定的文件信息,以下是对Oracle语法大全中提及的关键知识点的详细解析: ### Oracle SQL语句分类 Oracle SQL语句主要分为五大类,每类都有其特定的用途: 1. **数据检索(Select)**:用于从数据库中检索...

    常用常见 SQL语句语法

    ##### 13.2.4 INSERT 语法 `INSERT` 语句用于向表中插入新的行。基本语法如下: ```sql INSERT INTO table_name (column1, column2, ...) VALUES (value1, value2, ...); ``` 其中 `table_name` 是要插入数据的表...

Global site tag (gtag.js) - Google Analytics