

# Iceberg 테이블 데이터 업데이트
<a name="querying-iceberg-updating-iceberg-table-data"></a>

Iceberg 테이블 데이터는 `INSERT`, `UPDATE` 및 `DELETE` 쿼리를 사용하여 Athena에서 직접 관리할 수 있습니다. 각 데이터 관리 트랜잭션은 시간 이동을 사용하여 쿼리할 수 있는 새 스냅샷을 생성합니다. `UPDATE` 및 `DELETE` 문은 Iceberg 형식 v2 행 수준 [위치 삭제](https://iceberg.apache.org/spec/#position-delete-files) 사양 및 스냅샷 격리 적용을 따릅니다.

**참고**  
Athena SQL은 현재 copy-on-write 접근 방식을 지원하지 않습니다. `UPDATE`, `MERGE INTO`, `DELETE FROM` 작업은 지정된 테이블 속성에 관계없이 항상 위치 삭제와 함께 merge-on-read 접근 방식을 사용합니다. `write.update.mode`, `write.merge.mode` 및/또는 `write.delete.mode`와 같은 테이블 속성을 copy-on-write를 사용하도록 설정한 경우 Athena는 이를 무시하고 merge-on-read을 계속 사용하므로 쿼리가 실패하지 않습니다.

다음 명령을 사용하여 Iceberg 테이블에서 데이터 관리 작업을 수행합니다.

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

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

Iceberg 테이블에 데이터를 삽입합니다. Athena Iceberg `INSERT INTO`는 스캔 데이터의 양에 따라 외부 Hive 테이블에 대한 현재 `INSERT INTO` 쿼리와 동일한 요금이 부과됩니다. Iceberg 테이블에 데이터를 삽입하려면 다음 구문을 사용합니다. 여기서 *query*는 `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 위치 삭제 파일을 테이블에 씁니다. 이는 읽기 중 병합(merge-on-read) 삭제라고 알려져 있습니다. 쓸 때 복사(copy-on-write) 삭제와 달리 읽기 중 병합 삭제는 파일 데이터를 다시 쓰지 않기 때문에 더 효율적입니다. Athena가 Iceberg 데이터를 읽을 때 Iceberg 위치 삭제 파일을 데이터 파일과 병합하여 테이블의 최신 뷰를 생성합니다. 이러한 위치 삭제 파일을 제거하려면 [REWRITE DATA 압축 작업](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'
```

# MERGE INTO
<a name="querying-iceberg-merge-into"></a>

Iceberg 테이블에 행을 조건부로 업데이트, 삭제 또는 삽입합니다. 단일 명령문으로 업데이트, 삭제 및 삽입 작업을 결합할 수 있습니다. 구문은 [MERGE INTO](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` 대상 테이블을 조건부로 업데이트합니다. 이 예에서는 소스 주소가 Centreville인 일치하는 대상 행을 모두 삭제합니다. 모든 다른 일치하는 행의 경우 이 예에서는 소스 구매를 추가하고 대상 주소를 소스 주소로 설정합니다. 대상 테이블에 일치하는 항목이 없는 경우 이 예에서는 소스 테이블의 행을 삽입합니다.

```
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)
```