

 Amazon Redshift 將不再支援從修補程式 198 開始建立新的 Python UDFs。現有 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)
+ [Parameters](#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 陳述式的大小上限為 16 MB。

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

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

## Parameters
<a name="r_INSERT_30-parameters"></a>

 *table\$1name*   
暫時性或持久性資料表。只有資料表的擁有者，或具有資料表 INSERT 權限的使用者可以插入資料列。如果您使用 *query* 子句插入資料列，則必須具有查詢中所指名資料表的 SELECT 權限。  
使用 INSERT (外部資料表)，將 SELECT 查詢結果插入外部目錄上的現有資料表。如需詳細資訊，請參閱[INSERT (外部資料表)](r_INSERT_external_table.md)。

 *欄位*   
您可以將值插入資料表的一個或多個資料欄。您可以依任意順序列出目標資料欄名稱。若您未指定資料欄清單，則要插入的值必須依照 CREATE TABLE 陳述式中宣告的順序對應資料表資料欄。若要插入的值數目少於資料表中的資料欄數，則會在前 *n* 個資料欄中載入。  
任何未在 INSERT 陳述式中列出的資料欄中都會載入宣告的預設值或 null 值 (隱含或明確)。

DEFAULT VALUES   
若在建立資料表時對資料表中的資料欄指派預設值，請使用這些關鍵字插入完全由預設值組成的資料列。若有任何資料欄未包含預設值，則會將 null 插入這些資料欄。若有任何資料欄宣告 NOT NULL，則 INSERT 陳述式會傳回錯誤。

VALUES   
使用此關鍵字插入一個或多個資料列，每列包含一個或多個值。每列的 VALUES 清單必須符合資料欄清單。若要插入多個資料列，請使用逗號分隔符號分隔每份表達式清單。切勿重複 VALUES 關鍵字。多列 INSERT 陳述式的所有 VALUES 清單必須包含相同數目的值。

 *表達式*   
單一值，或判斷值為單一值的表達式。每個值都必須與其插入所在資料欄的資料類型相容。若值的資料類型與資料欄的宣告資料類型不相符，則會在可能的情況下自動轉換成相容的資料類型。例如：  
+ 小數值 `1.1` 插入 INT 資料欄時會是 `1`。
+ 小數值 `100.8976` 插入 DEC(5,2) 資料欄時會是 `100.90`。
您可以在表達式中包含類型轉換語法，藉此明確將值轉換成相容的資料類型。例如，若資料表 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 定義所指定的資料格式。

 將大量新資料列插入資料表之後：
+ 清空資料表以回收儲存空間和重新排序資料列。
+ 分析資料表以更新查詢規劃器的統計資訊。

若插入 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)。

# INSERT 範例
<a name="c_Examples_of_INSERT_30"></a>

TICKIT 資料庫中的 CATEGORY 資料表包含以下資料列：

```
 catid | catgroup |  catname  |                  catdesc
-------+----------+-----------+--------------------------------------------
     1 | Sports   | MLB       | Major League Baseball
     2 | Sports   | NHL       | National Hockey League
     3 | Sports   | NFL       | National Football League
     4 | Sports   | NBA       | National Basketball Association
     5 | Sports   | MLS       | Major League Soccer
     6 | Shows    | Musicals  | Musical theatre
     7 | Shows    | Plays     | All non-musical theatre
     8 | Shows    | Opera     | All opera and light opera
     9 | Concerts | Pop       | All rock and pop music concerts
    10 | Concerts | Jazz      | All jazz singers and bands
    11 | Concerts | Classical | All symphony, concerto, and choir concerts
(11 rows)
```

 以類似 CATEGORY 資料表的結構描述建立 CATEGORY\$1STAGE 資料表，但定義資料欄的預設值：

```
create table category_stage
(catid smallint default 0,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');
```

以下 INSERT 陳述式會選取 CATEGORY 資料表中的所有資料列，然後將它們插入 CATEGORY\$1STAGE 資料表。

```
insert into category_stage
(select * from category);
```

查詢前後的括號是選用的。

此命令會將新資料列插入 CATEGORY\$1STAGE 資料表，並且依序為每個資料欄指定值：

```
insert into category_stage values
(12, 'Concerts', 'Comedy', 'All stand-up comedy performances');
```

您也可以插入結合特定值與預設值的新資料列：

```
insert into category_stage values
(13, 'Concerts', 'Other', default);
```

執行以下查詢來傳回插入的資料列：

```
select * from category_stage
where catid in(12,13) order by 1;

 catid | catgroup | catname |             catdesc
-------+----------+---------+----------------------------------
    12 | Concerts | Comedy  | All stand-up comedy performances
    13 | Concerts | Other   | General
(2 rows)
```

以下範例說明一些多資料列 INSERT VALUES 陳述式。第一個範例會在兩個資料列中插入特定 CATID 值，並且在兩個資料列的其他資料欄中插入預設值。

```
insert into category_stage values
(14, default, default, default),
(15, default, default, default);

select * from category_stage where catid in(14,15) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
    14 | General  | General | General
    15 | General  | General | General
(2 rows)
```

下一個範例會插入包含不同的特定與預設值組合的三個資料列：

```
insert into category_stage values
(default, default, default, default),
(20, default, 'Country', default),
(21, 'Concerts', 'Rock', default);

select * from category_stage where catid in(0,20,21) order by 1;
 catid | catgroup | catname | catdesc
-------+----------+---------+---------
     0 | General  | General | General
    20 | General  | Country | General
    21 | Concerts | Rock    | General
(3 rows)
```

此範例中第一組 VALUES 產生的結果，與針對單一資料列 INSERT 陳述式指定 DEFAULT VALUES 的結果相同。

以下範例說明資料表有 IDENTITY 資料欄時的 INSERT 行為。首先，建立新的 CATEGORY 資料表版本，然後從 CATEGORY 將資料列插入其中：

```
create table category_ident
(catid int identity not null,
catgroup varchar(10) default 'General',
catname varchar(10) default 'General',
catdesc varchar(50) default 'General');


insert into category_ident(catgroup,catname,catdesc)
select catgroup,catname,catdesc from category;
```

請注意，您無法將特定整數值插入 CATID IDENTITY 資料欄。IDENTITY 資料欄的值會自動產生。

以下範例將示範，多資料列 INSERT VALUES 陳述式中無法使用子查詢做為表達式：

```
insert into category(catid) values
((select max(catid)+1 from category)),
((select max(catid)+2 from category));

ERROR: can't use subqueries in multi-row VALUES
```

下列範例會示範使用 `WITH SELECT` 子句將資料從 `venue` 資料表填入暫存資料表中的插入操作。如需 `venue` 資料表的相關資訊，請參閱 [範本資料庫](c_sampledb.md)。

首先，建立暫存資料表 `#venuetemp`。

```
CREATE TABLE #venuetemp AS SELECT * FROM venue;
```

列出 `#venuetemp` 資料表中的資料列。

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756	
...
```

使用 `WITH SELECT` 子句在 `#venuetemp` 資料表中插入 10 個重複的資料列。

```
INSERT INTO #venuetemp (WITH venuecopy AS (SELECT * FROM venue) SELECT * FROM venuecopy ORDER BY 1 LIMIT 10);
```

列出 `#venuetemp` 資料表中的資料列。

```
SELECT * FROM #venuetemp ORDER BY venueid;
         
venueid | venuename                | venuecity  | venuestate| venueseats
--------+--------------------------+------------+-----------+------------
1        Toyota Park                Bridgeview   IL          0	
1        Toyota Park                Bridgeview   IL          0	
2        Columbus Crew Stadium      Columbus     OH          0	
2        Columbus Crew Stadium      Columbus     OH          0	
3        RFK Stadium                Washington   DC          0
3        RFK Stadium                Washington   DC          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
4        CommunityAmerica Ballpark  Kansas City  KS          0	
5        Gillette Stadium           Foxborough   MA          68756
5        Gillette Stadium           Foxborough   MA          68756
...
```