INSERT - Amazon Redshift

INSERT

将新行插入到表中。您可以使用 VALUES 语法插入单行,使用 VALUES 语法插入多行,或者插入查询结果所定义的一行或多行 (INSERT INTO...SELECT)。

注意

我们强烈建议您使用 COPY 命令来加载大量数据。使用单个 INSERT 语句填充表可能过于缓慢。此外,如果您的数据在其他 Amazon Redshift 数据库表中已经存在,请使用 INSERT INTO SELECT 或 CREATE TABLE AS 来提高性能。有关使用 COPY 命令加载表的更多信息,请参阅在 Amazon Redshift 中加载数据

注意

单个 SQL 语句的最大大小为 16MB。

语法

INSERT INTO table_name [ ( column [, ...] ) ] {DEFAULT VALUES | VALUES ( { expression | DEFAULT } [, ...] ) [, ( { expression | DEFAULT } [, ...] ) [, ...] ] | query }

参数

table_name

一个临时或永久表。只有表的所有者或对表具有 INSERT 权限的用户才能插入行。如果您使用 query 子句插入行,必须对查询中指定的表拥有 SELECT 权限。

注意

使用 INSERT(外部表)可将 SELECT 查询的结果插入到外部目录中的现有表中。有关更多信息,请参阅 INSERT(外部表)

column

您可以将值插入到表的一个或多个列中。您可以按任意顺序列出目标列名。如果不指定列的列表,则要插入的值必须按照在 CREATE TABLE 语句中声明的顺序对应于表列。如果要插入的值数小于表中的列数,则将加载前 n 列。

对于在 INSERT 语句中未列出(隐式或显式)的任何列,声明的默认值或 null 值将被加载到这些列。

DEFAULT VALUES

如果在创建表时,已向表中的列分配默认值,则可使用这些关键字插入完全包含默认值的行。如果有任何列不具有默认值,则会向这些列插入 null。如果任何列被声明为 NOT NULL,则 INSERT 语句会返回错误。

VALUES

使用此关键字可插入一行或多行,每一行包括一个或多个值。每一行的 VALUES 列表必须与列的列表对应。要插入多个行,请在每个表达式列表之间使用逗号分隔符。不要重复使用 VALUES 关键字。多行 INSERT 语句的所有 VALUES 列表必须包含相同数量的值。

expression

单个值,或计算结果为单个值的表达式。每个值必须与该值所插入到的列的数据类型相兼容。对于其数据类型与列的已声明数据类型不匹配的值,会尽可能地自动转换为兼容的数据类型。例如:

  • 一个数字值 1.1 将以 1 值插入到 INT 列中。

  • 一个数字值 100.8976 将以 100.90 值插入到 DEC(5,2) 列中。

您可以通过在表达式中包含类型强制转换语法,显式地将值转换成某个兼容的数据类型。例如,表 T1 中的列 COL1 是 CHAR(3) 列:

insert into t1(col1) values('Incomplete'::char(3));

此语句将值 Inc 插入到列中。

对于单行 INSERT VALUES 语句,可以使用标量子查询作为表达式。子查询的结果将插入到适当的列中。

注意

对于多行 INSERT VALUES 语句,不支持将子查询用作表达式。

DEFAULT

使用此关键字可以按照在创建表时定义的方式,为列插入默认值。如果列不存在默认值,则插入 null 值。对于具有 NOT NULL 约束的列,如果没有在 CREATE TABLE 语句中明确为该列分配默认值,则不能将默认值插入到该列中。

query

通过定义任何查询,将一行或多行插入到表中。查询生成的所有行都将插入到表中。查询必须返回与表列相兼容的列的列表,不过列名称不一定要匹配。

使用说明

注意

我们强烈建议您使用 COPY 命令来加载大量数据。使用单个 INSERT 语句填充表可能过于缓慢。此外,如果您的数据在其他 Amazon Redshift 数据库表中已经存在,请使用 INSERT INTO SELECT 或 CREATE TABLE AS 来提高性能。有关使用 COPY 命令加载表的更多信息,请参阅在 Amazon Redshift 中加载数据

所插入值的数据格式必须与 CREATE TABLE 定义指定的数据格式匹配。

在表中插入大量新行后:

  • 对表执行 Vacuum 操作,以回收存储空间并对行重新排序。

  • 分析表以更新查询计划程序的统计数据。

如果在将值插入到 DECIMAL 列时,这些值超过了指定的小数位数,则会根据需要对加载的值向上取整。例如,如果将值 20.259 插入到 DECIMAL(8,2) 列中,则存储的值是 20.26

您可以插入到 GENERATED BY DEFAULT AS IDENTITY 列。您可以使用您提供的值来更新定义为 GENERATED BY DEFAULT AS IDENTITY 的列。有关更多信息,请参阅 GENERATED BY DEFAULT AS IDENTITY