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(데이터 조작 언어) 관련 문서를 참고해요.