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 절에서 테이블(예:
t1
및t2
) 사이에 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
의 최소값이 있는 행의 값)로 업데이트되고 오류를 발생시키지 않습니다.