카테고리:

DML 명령 - 일반

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

업데이트할 행을 선택하거나 새 값을 설정하는 데 사용할 하나 이상의 테이블을 지정합니다. 대상 테이블을 반복하면 자체 조인이 발생합니다.

WHERE condition

업데이트할 대상 테이블의 행을 지정하는 식입니다.

기본값: 값 없음(대상 테이블의 모든 행이 업데이트됨)

사용법 노트

  • FROM 절에서 테이블(예: t1t2) 사이에 JOIN 이 있을 때, t1 의 대상 행이 테이블 t2 에 있는 둘 이상의 행에 대해 조인(즉, 일치)할 수 있습니다. 이런 상황이 발생할 때 대상 행을 다중 조인 행 이라고 합니다. 다중 조인 행을 업데이트할 때 ERROR_ON_NONDETERMINISTIC_UPDATE 세션 매개 변수는 업데이트 결과를 제어합니다.

    • FALSE (기본값)인 경우 아무런 오류도 반환되지 않으며 조인된 행 중 하나가 대상 행을 업데이트하는 데 사용되지만, 선택한 조인 행은 비결정적입니다.

    • IF 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 의 최소값이 있는 행의 값)로 업데이트되고 오류를 발생시키지 않습니다.

맨 위로 이동