> ## Documentation Index
> Fetch the complete documentation index at: https://villagesql.com/docs/llms.txt
> Use this file to discover all available pages before exploring further.

# MySQL UPDATE

> MySQL UPDATE 문이 이미 테이블에 있는 행을 바꾸는 방식, Rows matched와 Changed가 각각 세는 것, 그리고 WHERE를 빼면 일어나는 일입니다.

> [card] [VillageSQL is a drop-in replacement for MySQL with extensions.](https://villagesql.com/docs/en/8.4/stable/install-server.md)
>
> All examples on this page work on VillageSQL. Install Now →

`UPDATE`는 이미 있는 행을 바꿉니다. `WHERE`가 어떤 행인지 결정하고, 1개의 행과 테이블 전체 사이에 서 있는 유일한 것이 `WHERE`입니다.

이 예제들은 [INSERT](https://villagesql.com/docs/ko/tutorial/insert.md)의 `sakila_practice` 데이터베이스를 사용합니다. 시작하기 전에 거기 있는 설정 블록을 다시 실행한 다음, `mysql -u root -p sakila_practice`로 클라이언트를 여세요.

## UPDATE의 동작 방식

```sql theme={null}
UPDATE TABLE_NAME
SET COLUMN_NAME = NEW_VALUE
WHERE CONDITION;
```

`TABLE_NAME`을 테이블로, `COLUMN_NAME`을 바꿀 열로, `NEW_VALUE`를 넣을 값으로, `CONDITION`을 행을 고르는 검사로 바꾸세요.

`WHERE`는 `SELECT`에서와 정확히 같이 동작하고, 그것이 `UPDATE`를 가장 안전하게 쓰는 방법입니다: 먼저 `SELECT`로 실행해서 행을 본 다음, `SELECT ...`를 `UPDATE ... SET ...`으로 바꾸고 `WHERE`는 그대로 두세요.

## 예제

### 1개의 행 바꾸기

```sql theme={null}
UPDATE member SET active = 0 WHERE member_id = 2;
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

```sql theme={null}
SELECT member_id, first_name, last_name, active FROM member;
```

```text theme={null}
+-----------+------------+-----------+--------+
| member_id | first_name | last_name | active |
+-----------+------------+-----------+--------+
|         1 | Mary       | Smith     |      1 |
|         2 | Patricia   | Johnson   |      0 |
|         3 | Linda      | Williams  |      0 |
+-----------+------------+-----------+--------+
3 rows in set (0.00 sec)
```

### Matched와 Changed는 다른 것을 셉니다

같은 문을 한 번 더 실행하세요.

```sql theme={null}
UPDATE member SET active = 0 WHERE member_id = 2;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
Rows matched: 1  Changed: 0  Warnings: 0
```

`WHERE`는 여전히 그 행을 찾았으므로 `Rows matched`는 1입니다. 행에는 이미 0이 있었으므로 아무것도 쓰이지 않았고 `Changed`는 0입니다. 2개의 숫자를 함께 읽으세요: `matched 0`은 `WHERE`가 아무것도 찾지 못했다는 뜻이고, `changed 0`은 행이 이미 가진 값을 요청했다는 뜻이므로 서로 다른 문제입니다.

### 여러 열을 한 번에 바꾸기

대입을 `AND`가 아니라 쉼표로 구분하세요.

```sql theme={null}
UPDATE member
SET last_name = 'Smith-Davis', email = 'mary.smith-davis@example.com'
WHERE member_id = 1;
```

```text theme={null}
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
```

```sql theme={null}
SELECT member_id, first_name, last_name, email FROM member WHERE member_id = 1;
```

```text theme={null}
+-----------+------------+-------------+------------------------------+
| member_id | first_name | last_name   | email                        |
+-----------+------------+-------------+------------------------------+
|         1 | Mary       | Smith-Davis | mary.smith-davis@example.com |
+-----------+------------+-------------+------------------------------+
1 row in set (0.00 sec)
```

## UPDATE는 INSERT와 같은 제약 조건을 만납니다

다른 행이 가진 값을 `UNIQUE` 열에 넣으면 같은 방식으로 실패하고, 행은 가지고 있던 값을 유지합니다.

```sql theme={null}
UPDATE member SET email = 'patricia.johnson@example.com' WHERE member_id = 3;
```

```text theme={null}
ERROR 1062 (23000): Duplicate entry 'patricia.johnson@example.com' for key 'member.uq_member_email'
```

## WHERE가 없으면 모든 행을 바꿉니다

확인 단계는 없습니다. 문이 실행되고 테이블의 모든 행이 새 값을 받습니다.

세션 설정이 그런 형태를 대신 거부해 줄 수 있습니다. 안전 업데이트 모드는 `WHERE`에서 키 열을 검사하지도 않고 `LIMIT`도 없는 `UPDATE`나 `DELETE`를 거부하며, 요청하지 않으면 꺼져 있습니다.

```sql theme={null}
SET SESSION sql_safe_updates = 1;
UPDATE member SET active = 1;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)

ERROR 1175 (HY000): You are using safe update mode and you tried to update a table without a WHERE that uses a KEY column.
```

첫 번째 문부터 이 보호를 받으려면 `mysql -u root -p --safe-updates sakila_practice`로 클라이언트를 시작하세요. 그 플래그는 이 1개의 변수를 설정하는 것 이상을 합니다: `sql_select_limit`으로 `SELECT`를 1,000개의 행으로 제한하고 `max_join_size`로 조인을 제한하므로, 큰 테이블을 읽으면 아무 말 없이 잘린 결과가 돌아옵니다. `ERROR 1175`는 보호 장치가 당신을 멈췄다는 뜻입니다.

문이 정말로 모든 행을 건드려야 할 때는 다시 끄세요.

```sql theme={null}
SET SESSION sql_safe_updates = 0;
```

```text theme={null}
Query OK, 0 rows affected (0.00 sec)
```

보호 장치가 꺼지면 문이 실행됩니다.

```sql theme={null}
UPDATE member SET active = 1;
```

```text theme={null}
Query OK, 2 rows affected (0.00 sec)
Rows matched: 3  Changed: 2  Warnings: 0
```

```sql theme={null}
SELECT member_id, first_name, active FROM member;
```

```text theme={null}
+-----------+------------+--------+
| member_id | first_name | active |
+-----------+------------+--------+
|         1 | Mary       |      1 |
|         2 | Patricia   |      1 |
|         3 | Linda      |      1 |
+-----------+------------+--------+
3 rows in set (0.00 sec)
```

`Rows matched: 3  Changed: 2`인 것은 1명의 회원이 이미 활성 상태였기 때문입니다.

테이블 전체 업데이트가 정확히 맞을 때도 있습니다. 모든 잔액을 5% 올리는 것은 1개의 문이고, 새 값은 이전 값에서 계산됩니다.

```sql theme={null}
UPDATE account SET balance = balance * 1.05;
```

```text theme={null}
Query OK, 2 rows affected (0.00 sec)
Rows matched: 2  Changed: 2  Warnings: 0
```

```sql theme={null}
SELECT * FROM account;
```

```text theme={null}
+------------+------------------+---------+
| account_id | owner            | balance |
+------------+------------------+---------+
|          1 | Mary Smith       |  525.00 |
|          2 | Patricia Johnson |  262.50 |
+------------+------------------+---------+
2 rows in set (0.00 sec)
```

`balance = balance * 1.05`는 각 행의 현재 값을 읽으므로, 모든 행이 자기만의 답을 받습니다.

## 요약

* 기존 행을 바꾸려면 `UPDATE table SET column = value WHERE condition`을 쓰세요.
* `WHERE`를 먼저 `SELECT`로 실행한 다음, 문장의 앞부분만 바꾸세요.
* `Rows matched`와 `Changed`를 2개의 별개 사실로 읽으세요.
* 여러 대입은 쉼표로 구분하세요.
* `UPDATE`는 `INSERT`와 같은 `UNIQUE` 및 `NOT NULL` 규칙에 부딪힌다고 예상하세요.
* 안전 업데이트 모드를 켜고, `ERROR 1175`는 보호 장치가 제 일을 하는 것으로 읽으세요.

## 함께 보기

* [WHERE](https://villagesql.com/docs/ko/tutorial/where.md) — 어떤 행이 바뀔지 결정하는 절
* [DELETE](https://villagesql.com/docs/ko/tutorial/delete.md) — 행을 바꾸는 대신 삭제하기
* [업서트](https://villagesql.com/docs/ko/tutorial/upsert.md) — 기존 행을 업데이트하거나, 없으면 삽입하기
* [트랜잭션](https://villagesql.com/docs/ko/tutorial/transactions.md) — 잘못된 UPDATE 되돌리기


This documentation is built and hosted on [Mintlify](https://mintlify.com), a developer documentation platform.