

本文為英文版的機器翻譯版本，如內容有任何歧義或不一致之處，概以英文版為準。

# 更新 Iceberg 資料表資料
<a name="querying-iceberg-updating-iceberg-table-data"></a>

您可以使用 `INSERT`、`UPDATE` 和 `DELETE` 查詢，直接在 Athena 上管理 Iceberg 資料表資料。每次資料管理異動都會產生新的快照，使用時間歷程查詢可查詢此快照。`UPDATE` 和 `DELETE` 陳述式遵循 Iceberg v2 格式的資料列級[位置刪除](https://iceberg.apache.org/spec/#position-delete-files)規格，並強制執行快照隔離。

**注意**  
Athena SQL 目前不支援寫入時複製方法。無論指定的資料表屬性為何，`UPDATE`、`MERGE INTO` 和 `DELETE FROM` 操作一律使用讀取時合併方法和位置刪除。如果您已設定資料表屬性 (例如 `write.update.mode`、`write.merge.mode` 及/或 `write.delete.mode` 以使用寫入時複製)，則您的查詢不會失敗，因為 Athena 會忽略它們並繼續使用讀取時合併。

使用以下命令對 Iceberg 資料表執行資料管理操作。

**Topics**
+ [INSERT INTO](querying-iceberg-insert-into.md)
+ [DELETE](querying-iceberg-delete.md)
+ [UPDATE](querying-iceberg-update.md)
+ [合併為](querying-iceberg-merge-into.md)

# INSERT INTO
<a name="querying-iceberg-insert-into"></a>

將資料插入 Iceberg 資料表。Athena Iceberg `INSERT INTO` 的收費與目前針對外部 Hive 資料表的 `INSERT INTO` 查詢相同，即按掃描的資料量收費。若要將資料插入 Iceberg 資料表，請使用以下語法，其中*查詢*可能是 `VALUES (val1, val2, ...)` 或 `SELECT (col1, col2, …) FROM [db_name.]table_name WHERE predicate`。如需有關 SQL 語法和語意的詳細資訊，則請參閱 [INSERT INTO](insert-into.md)。

```
INSERT INTO [db_name.]table_name [(col1, col2, …)] query
```

下列範例會將值插入資料表 `iceberg_table` 中。

```
INSERT INTO iceberg_table VALUES (1,'a','c1')
```

```
INSERT INTO iceberg_table (col1, col2, ...) VALUES (val1, val2, ...)
```

```
INSERT INTO iceberg_table SELECT * FROM another_table
```

# DELETE
<a name="querying-iceberg-delete"></a>

Athena Iceberg `DELETE` 將 Iceberg 位置刪除檔案寫入資料表。這稱為讀取時合併刪除。與寫入時複製刪除不同，讀取時合併刪除效率更高，因為它不會重寫檔案資料。當 Athena 讀取 Iceberg 資料時，它將 Iceberg 位置刪除檔案與資料檔案合併，以產生資料表的最新檢視。若要刪除這些位置刪除檔案，您可以執行[重寫資料壓縮動作](querying-iceberg-data-optimization.md#querying-iceberg-data-optimization-rewrite-data-action)。`DELETE` 操作將按掃描的資料量計費。如需語法，請參閱[DELETE](delete-statement.md)。

下列範例會刪除 `iceberg_table` 中 `category` 值為 `c3` 的資料列。

```
DELETE FROM iceberg_table WHERE category='c3'
```

# UPDATE
<a name="querying-iceberg-update"></a>

Athena Iceberg `UPDATE` 將 Iceberg 位置刪除檔案和最新更新的資料列寫為相同交易中的資料檔案。`UPDATE` 可以想象為 `INSERT INTO` 和 `DELETE`。`UPDATE` 操作將按掃描的資料量計費。如需語法，請參閱[UPDATE](update-statement.md)。

下列範例會更新資料表 `iceberg_table` 中的指定值。

```
UPDATE iceberg_table SET category='c2' WHERE category='c1'
```

# 合併為
<a name="querying-iceberg-merge-into"></a>

有條件地更新、刪除資料列或將其插入至 Iceberg 資料表。單一陳述式可以組合更新、刪除和插入動作。如需語法，請參閱[合併為](merge-into-statement.md)。

**注意**  
`MERGE INTO` 是交易型的並且僅由 Athena 引擎版本 3 中的 Apache Iceberg 資料表支援。

下列範例會從來源資料表 `s` 中的資料表 `t` 刪除所有客戶。

```
MERGE INTO accounts t USING monthly_accounts_update s
ON t.customer = s.customer
WHEN MATCHED
THEN DELETE
```

下列範例會使用來源資料表 `s` 中的客戶資訊更新目標資料表 `t`。對於資料表 `s` 中具有相符客戶資料列之資料表 `t` 中的客戶資料列，此範例會在資料表 t 中遞增購買項目。如果資料表 `t` 與資料表 `s` 中的客戶資料列不相符，則該範例會將客戶資料列從資料表 `s` 插入到資料表 `t` 中。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED
        THEN UPDATE SET purchases = s.purchases + t.purchases
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```

下列範例會使用來源資料表 `s` 中的資訊偶爾更新目標資料表 `t`。此範例會刪除來源地址為森特維爾的任何相符的目標資料列。對於所有其他相符的資料列，此範例會新增來源購買項目，並將目標地址設定為來源地址。如果目標資料表中沒有相符項目，則範例會從來源資料表插入資料列。

```
MERGE INTO accounts t USING monthly_accounts_update s
    ON (t.customer = s.customer)
    WHEN MATCHED AND s.address = 'Centreville'
        THEN DELETE
    WHEN MATCHED
        THEN UPDATE
            SET purchases = s.purchases + t.purchases, address = s.address
    WHEN NOT MATCHED
        THEN INSERT (customer, purchases, address)
              VALUES(s.customer, s.purchases, s.address)
```