INSERT

    描述

    INSERT 将新行插入到一个表中。我们可以 插入一个或者更多由值表达式指定的行,或者插入来自一个查询的零行 或者更多行。

    目标列的名称可以以任意顺序列出。如果没有给出列名列表,默认的方式是按照表在定义时列的顺序。VALUES子句或者query提供的值会被从左至右关联到这些显式或者隐式给出的目标列。

    每一个没有出现在显式或者隐式列列表中的列都将被默认填充,如果为该列 声明过默认值则用默认值填充,否则用空值填充。

    如果任意列的表达式不是正确的数据类型,将会尝试自动类型转换。

    为了向表中插入数据,用户必须拥有在其上的INSERT 特权。

    输出

    成功完成时,INSERT 命令会返回以下形式的命令标签:

      count 是被插入的行数。 如果count正好为 1 并且 目标表具有 OID,那么oid 就是分配给被插入行的 OID。否则oid为零。

      table

      一个已有表的名称(可以被方案限定)。

      在表中的列的名称。如有必要,列名可以用一个子域名或者数组下标限定(指向 一个组合列的某些列中插入会让其他域为空)。

      DEFAULT VALUES

      所有列都将被其默认值填充。

      expression

      要赋予给相应列的表达式或者值。

      DEFAULT

      相应的列将被其默认值填充。

      query

      提供要被插入行的查询(SELECT语句)。 其语法描述参考SELECT语句。

      注解

      要插入数据到一个分区表中,需要制定根分区表,该表通过CREATE TABLE命令创建。也需要在INSERT命令中指定分区表的一个叶子还在表。如果对于指定的叶子还在表数据是无效将抛出错误。在INSERT命令指定一个非叶子表为子表还不支持。其他DML命令,例如UPDATE和DELETE,在任何一个分区表的子表上的执行还不支持。这些命令一定是执行在根分区表上面,即那些通过CREATE TABLE创建的表。

      对于可写S3外部表,INSERT操作更新在配置S3桶中的一个或者更多的文件,正如描述在s3://协议中的。通过Ctrl-c能够取消INSERT同时停止更新到S3。

      插入当条行到表films中:

      在这个示例中,列length 被忽略,因此它将被默认值填充:

      1. INSERT INTO films (code, title, did, date_prod, kind) VALUES

      这个示例中对列date_prod使用了DEFAULT子句而不是指定一个具体的值:

      插入一条全部都是由默认值组成的行:

      1. INSERT INTO films DEFAULT VALUES;

      通过语法多行的VALUES语法同时插入多条行的数据:

      在这个示例中,从具有相同表结构的表tmp_films插入若干的行到表films:

      1. '2004-05-07';

      兼容性

      INSERT 符合SQL标准。标准不允许省略列名列表但不通过 VALUES 或者query填充 所有列的情况。

      query 子句可能的限制在 SELECT有介绍。

      COPY, , CREATE EXTERNAL TABLE,