`

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 ...

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

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

    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...

    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集的计算功能...

    常用常见 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