VillageSQL is a drop-in replacement for MySQL with extensions.
All examples on this page work on VillageSQL. Install Now →
UPDATE는 이미 있는 행을 바꿉니다. WHERE가 어떤 행인지 결정하고, 1개의 행과 테이블 전체 사이에 서 있는 유일한 것이 WHERE입니다.
이 예제들은 INSERT의 sakila_practice 데이터베이스를 사용합니다. 시작하기 전에 거기 있는 설정 블록을 다시 실행한 다음, mysql -u root -p sakila_practice로 클라이언트를 여세요.
UPDATE의 동작 방식
TABLE_NAME을 테이블로, COLUMN_NAME을 바꿀 열로, NEW_VALUE를 넣을 값으로, CONDITION을 행을 고르는 검사로 바꾸세요.
WHERE는 SELECT에서와 정확히 같이 동작하고, 그것이 UPDATE를 가장 안전하게 쓰는 방법입니다: 먼저 SELECT로 실행해서 행을 본 다음, SELECT ...를 UPDATE ... SET ...으로 바꾸고 WHERE는 그대로 두세요.
예제
- 1개의 행 바꾸기
- Matched와 Changed는 다른 것을 셉니다
같은 문을 한 번 더 실행하세요.
WHERE는 여전히 그 행을 찾았으므로 Rows matched는 1입니다. 행에는 이미 0이 있었으므로 아무것도 쓰이지 않았고 Changed는 0입니다. 2개의 숫자를 함께 읽으세요: matched 0은 WHERE가 아무것도 찾지 못했다는 뜻이고, changed 0은 행이 이미 가진 값을 요청했다는 뜻이므로 서로 다른 문제입니다.
- 여러 열을 한 번에 바꾸기
대입을 AND가 아니라 쉼표로 구분하세요.
UPDATE는 INSERT와 같은 제약 조건을 만납니다
다른 행이 가진 값을UNIQUE 열에 넣으면 같은 방식으로 실패하고, 행은 가지고 있던 값을 유지합니다.
WHERE가 없으면 모든 행을 바꿉니다
확인 단계는 없습니다. 문이 실행되고 테이블의 모든 행이 새 값을 받습니다. 세션 설정이 그런 형태를 대신 거부해 줄 수 있습니다. 안전 업데이트 모드는WHERE에서 키 열을 검사하지도 않고 LIMIT도 없는 UPDATE나 DELETE를 거부하며, 요청하지 않으면 꺼져 있습니다.
mysql -u root -p --safe-updates sakila_practice로 클라이언트를 시작하세요. 그 플래그는 이 1개의 변수를 설정하는 것 이상을 합니다: sql_select_limit으로 SELECT를 1,000개의 행으로 제한하고 max_join_size로 조인을 제한하므로, 큰 테이블을 읽으면 아무 말 없이 잘린 결과가 돌아옵니다. ERROR 1175는 보호 장치가 당신을 멈췄다는 뜻입니다.
문이 정말로 모든 행을 건드려야 할 때는 다시 끄세요.
Rows matched: 3 Changed: 2인 것은 1명의 회원이 이미 활성 상태였기 때문입니다.
테이블 전체 업데이트가 정확히 맞을 때도 있습니다. 모든 잔액을 5% 올리는 것은 1개의 문이고, 새 값은 이전 값에서 계산됩니다.
balance = balance * 1.05는 각 행의 현재 값을 읽으므로, 모든 행이 자기만의 답을 받습니다.
요약
- 기존 행을 바꾸려면
UPDATE table SET column = value WHERE condition을 쓰세요. WHERE를 먼저SELECT로 실행한 다음, 문장의 앞부분만 바꾸세요.Rows matched와Changed를 2개의 별개 사실로 읽으세요.- 여러 대입은 쉼표로 구분하세요.
UPDATE는INSERT와 같은UNIQUE및NOT NULL규칙에 부딪힌다고 예상하세요.- 안전 업데이트 모드를 켜고,
ERROR 1175는 보호 장치가 제 일을 하는 것으로 읽으세요.