

 从补丁 198 开始，Amazon Redshift 将不再支持创建新的 Python UDF。现有的 Python UDF 将继续正常运行至 2026 年 6 月 30 日。有关更多信息，请参阅[博客文章](https://aws.amazon.com/blogs/big-data/amazon-redshift-python-user-defined-functions-will-reach-end-of-support-after-june-30-2026/)。

# INSERT
<a name="r_INSERT_30"></a>

**Topics**
+ [语法](#r_INSERT_30-synopsis)
+ [参数](#r_INSERT_30-parameters)
+ [使用说明](#r_INSERT_30_usage_notes)
+ [INSERT 示例](c_Examples_of_INSERT_30.md)

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

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

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

## 语法
<a name="r_INSERT_30-synopsis"></a>

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

## 参数
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
一个临时或永久表。只有表的所有者或对表具有 INSERT 权限的用户才能插入行。如果您使用 *query* 子句插入行，必须对查询中指定的表拥有 SELECT 权限。  
使用 INSERT（外部表）可将 SELECT 查询的结果插入到外部目录中的现有表中。有关更多信息，请参阅 [INSERT（外部表）](r_INSERT_external_table.md)。

 *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*   
通过定义任何查询，将一行或多行插入到表中。查询生成的所有行都将插入到表中。查询必须返回与表列相兼容的列的列表，不过列名称不一定要匹配。

## 使用说明
<a name="r_INSERT_30_usage_notes"></a>

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

所插入值的数据格式必须与 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](r_CREATE_TABLE_NEW.md#identity-generated-bydefault-clause)。