

# 테이블에서 데이터를 수정할 때 관계형(SQL) 데이터베이스와 DynamoDB 비교
<a name="SQLtoNoSQL.UpdateData"></a>

SQL 언어는 데이터 수정을 위한 `UPDATE` 문을 제공합니다. Amazon DynamoDB는 비슷한 태스크를 위해 `UpdateItem` 작업을 사용합니다.

**Topics**
+ [SQL에서 테이블의 데이터 수정](#SQLtoNoSQL.UpdateData.SQL)
+ [DynamoDB에서 테이블의 데이터 수정](#SQLtoNoSQL.UpdateData.DynamoDB)

## SQL에서 테이블의 데이터 수정
<a name="SQLtoNoSQL.UpdateData.SQL"></a>

SQL에서는 `UPDATE` 문을 사용하여 하나 이상의 행을 수정합니다. `SET` 절은 하나 이상의 열의 새로운 값을 지정하고, `WHERE` 절은 어떤 행이 수정되는지 결정합니다. 다음은 예입니다.

```
UPDATE Music
SET RecordLabel = 'Global Records'
WHERE Artist = 'No One You Know' AND SongTitle = 'Call Me Today';
```

`WHERE` 절과 일치하는 행이 없으면 `UPDATE` 문은 영향을 미치지 않습니다.

## DynamoDB에서 테이블의 데이터 수정
<a name="SQLtoNoSQL.UpdateData.DynamoDB"></a>

DynamoDB에서는 클래식 API나 [PartiQL](https://docs.aws.amazon.com/amazondynamodb/latest/developerguide/ql-reference.html)(SQL 호환 쿼리 언어)을 사용하여 단일 항목을 수정할 수 있습니다. 복수의 항목을 수정하려면 복수의 작업을 사용해야 합니다.

------
#### [ DynamoDB API ]

DynamoDB API에서는 `UpdateItem` 작업을 사용하여 단일 항목을 수정합니다.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ExpressionAttributeValues: {
        ":label": "Global Records"
    }
}
```

수정할 항목의 `Key` 속성과 속성 값을 지정하는 `UpdateExpression`을 지정해야 합니다. `UpdateItem`은 'upsert' 작업처럼 동작합니다. 즉 항목이 테이블에 존재하면 업데이트되지만 그렇지 않으면 새 항목이 추가(삽입)됩니다.

`UpdateItem`은 *조건부 쓰기*를 지원하는데, 특정 `ConditionExpression`이 true로 평가되는 경우에 한해 작업이 성공합니다. 예를 들어, 다음 `UpdateItem` 작업은 노래의 가격이 2.00 이상이 아니면 업데이트를 수행하지 않습니다.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET RecordLabel = :label",
    ConditionExpression: "Price >= :p",
    ExpressionAttributeValues: {
        ":label": "Global Records",
        ":p": 2.00
    }
}
```

`UpdateItem`은 *원자성 카운터* 즉, 증가하거나 감소할 수 있는 `Number` 형식의 속성도 지원합니다. 원자성 카운터는 여러 가지 면에서 SQL 데이터베이스의 시퀀스 발생기, 자격 증명 열 또는 자동 증분 필드와 유사합니다.

다음은 `UpdateItem` 작업을 통해 새 속성(*Plays*)을 초기화하여 노래가 재생된 횟수를 추적하는 예제입니다.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = :val",
    ExpressionAttributeValues: {
        ":val": 0
    },
    ReturnValues: "UPDATED_NEW"
}
```

`ReturnValues` 파라미터는 업데이트된 속성의 새 값을 반환하는 `UPDATED_NEW`로 설정됩니다. 이 경우에는 0을 반환합니다.

누군가가 이 노래를 재생할 때마다 다음 `UpdateItem` 작업을 사용하여 *Plays*를 1씩 증가시킬 수 있습니다.

```
{
    TableName: "Music",
    Key: {
        "Artist":"No One You Know",
        "SongTitle":"Call Me Today"
    },
    UpdateExpression: "SET Plays = Plays + :incr",
    ExpressionAttributeValues: {
        ":incr": 1
    },
    ReturnValues: "UPDATED_NEW"
}
```

------
#### [ PartiQL for DynamoDB ]

PartiQL에서는 PartiQL `Update` 문을 사용하여 `ExecuteStatement` 작업을 통해 테이블의 항목을 수정합니다.

이 테이블의 기본 키는 *Artist* 및 *SongTitle*로 구성됩니다. 이 속성들의 값을 지정해야 합니다.

```
UPDATE Music
SET RecordLabel ='Global Records'
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

다음 예와 같이 여러 필드를 한 번에 수정할 수도 있습니다.

```
UPDATE Music
SET RecordLabel = 'Global Records'
SET AwardsWon = 10
WHERE Artist ='No One You Know' AND SongTitle='Call Me Today'
```

`Update`은 *원자성 카운터* 즉, 증가하거나 감소할 수 있는 `Number` 형식의 속성도 지원합니다. 원자성 카운터는 여러 가지 면에서 SQL 데이터베이스의 시퀀스 발생기, 자격 증명 열 또는 자동 증분 필드와 유사합니다.

다음은 `Update` 문을 통해 새 속성(*Plays*)을 초기화하여 노래가 재생된 횟수를 추적하는 예제입니다.

```
UPDATE Music
SET Plays = 0
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

누군가가 이 노래를 재생할 때마다 다음 `Update` 문을 사용하여 *Plays*를 1씩 증가시킬 수 있습니다.

```
UPDATE Music
SET Plays = Plays + 1
WHERE Artist='No One You Know' AND SongTitle='Call Me Today'
```

**참고**  
`Update` 및 `ExecuteStatement`를 사용하는 코드 예제는 [DynamoDB의 PartiQL update 문](ql-reference.update.md) 섹션을 참조하세요.

------