UPDATE
UPDATE
대상 테이블의 지정된 행을 새 값으로 업데이트하는 명령이에요.
출처: 문서
본문
대상 테이블의 지정된 행을 새 값으로 업데이트해요.
구문
UPDATE <target_table>
SET <col_name> = <value> [ , <col_name> = <value> , ... ]
[ FROM <additional_tables> ]
[ WHERE <condition> ]
필수 매개변수
- target_table: 업데이트할 테이블을 지정해요.
- col_name: target_table에 있는 컬럼의 이름을 지정해요. 테이블 이름은 포함하지 마세요. 예를 들어
UPDATE t1 SET t1.col = 1은 유효하지 않아요. - value: col_name에 설정할 새 값을 지정해요.
선택 매개변수
- FROM additional_tables: 업데이트할 행을 선택하거나 새 값을 설정하는 데 사용할 테이블을 하나 이상 지정해요. 대상 테이블을 반복하면 자기 조인(self-join)이 된다는 점에 주의해요.
- WHERE condition: 대상 테이블에서 업데이트할 행을 지정하는 표현식이에요. 기본값: 값 없음(대상 테이블의 모든 행이 업데이트됨).
사용 메모
- FROM 절에 테이블(예: t1과 t2) 간 JOIN이 포함되면, t1의 대상 행이 테이블 t2의 둘 이상의 행에 조인(즉 일치)할 수 있어요. 이런 경우 대상 행을 다중 조인 행(multi-joined row)이라고 해요. 다중 조인 행을 업데이트할 때 ERROR_ON_NONDETERMINISTIC_UPDATE 세션 매개변수가 업데이트 결과를 제어해요:
- FALSE(기본값)면 오류가 반환되지 않고 조인된 행 중 하나를 사용해 대상 행을 업데이트해요. 그러나 선택된 조인 행은 비결정적(nondeterministic)이에요.
- TRUE면 여러 행에 조인되는 대상 행의 값 예를 포함한 오류가 반환돼요.
- 매개변수를 설정하려면:
ALTER SESSION SET ERROR_ON_NONDETERMINISTIC_UPDATE=TRUE;
예제
두 테이블을 사용한 표준 업데이트 수행:
UPDATE t1
SET number_column = t1.number_column + t2.number_column, t1.text_column = 'ASDF'
FROM t2
WHERE t1.key_column = t2.t1_key and t1.number_column < 10;
비결정적 결과를 만드는 조인이 있는 업데이트:
select * from target;
+---+----+
| K | V |
|---+----|
| 0 | 10 |
+---+----+
Select * from src;
+---+----+
| K | V |
|---+----|
| 0 | 11 |
| 0 | 12 |
| 0 | 13 |
+---+----+
-- Following statement joins all three rows in src against the single row in target
UPDATE target
SET v = src.v
FROM src
WHERE target.k = src.k;
+------------------------+-------------------------------------+
| number of rows updated | number of multi-joined rows updated |
|------------------------+-------------------------------------|
| 1 | 1 |
+------------------------+-------------------------------------+
ERROR_ON_NONDETERMINISTIC_UPDATE = FALSE이면 문은 src의 다음 행 중 하나의 값을 사용해 target의 단일 행을 무작위로 업데이트해요: (0, 11), (0, 12), (0, 13). ERROR_ON_NONDETERMINISTIC_UPDATE = TRUE이면 중복 DML 행 [0, 10]을 보고하는 오류가 반환돼요.
이 비결정적 동작과 오류를 피하려면 1:1 조인을 사용해요:
UPDATE target SET v = b.v
FROM (SELECT k, MIN(v) v FROM src GROUP BY k) b
WHERE target.k = b.k;
이 문은 target의 단일 행이 (0, 11)(src에서 v의 최소값을 가진 행의 값)로 업데이트되고 절대 오류를 일으키지 않아요.
더 알아보기 (Learn more)
- DML(데이터 조작 언어) 관련 문서를 참고해요.