UPDATE 문

UPDATE 문 (UPDATE Statement)

UPDATE 문은 테이블에서 행의 값을 수정해요. 특정 조건에 맞는 행만 골라 값을 바꾸거나, 다른 테이블의 값을 참조해 일괄 업데이트하는 것도 가능해요.

출처: 문서

본문

예시 (Examples)

iNULL인 모든 행에 대해 값을 0으로 설정해요:

UPDATE tbl
SET i = 0
WHERE i IS NULL;

모든 i 값을 1로, 모든 j 값을 2로 설정해요:

UPDATE tbl
SET i = 1, j = 2;

문법 (Syntax)

UPDATE는 조건을 만족하는 모든 행에서 지정한 열의 값을 변경해요. SET 절에는 수정할 열만 언급하면 되고, 명시적으로 수정하지 않은 열은 이전 값을 유지해요.

다른 테이블에서 업데이트 (Update from Other Table)

다른 테이블의 값을 바탕으로 테이블을 업데이트할 수 있어요. FROM 절에 테이블을 지정하거나 서브 셀렉트 문을 사용하면 돼요. 두 접근 방식 모두 UPDATE 연산을 벌크로 완료해 성능을 높여요.

CREATE OR REPLACE TABLE original AS
    SELECT 1 AS key, 'original value' AS value
    UNION ALL
    SELECT 2 AS key, 'original value 2' AS value;

CREATE OR REPLACE TABLE new AS
    SELECT 1 AS key, 'new value' AS value
    UNION ALL
    SELECT 2 AS key, 'new value 2' AS value;

SELECT *
FROM original;
key value
1 original value
2 original value 2
UPDATE original
    SET value = new.value
    FROM new
    WHERE original.key = new.key;

또는:

UPDATE original
    SET value = (
        SELECT
            new.value
        FROM new
        WHERE original.key = new.key
    );
SELECT *
FROM original;
key value
1 new value
2 new value 2

같은 테이블에서 업데이트 (Update from Same Table)

이 경우와 위 경우의 유일한 차이는 대상 테이블과 소스 테이블 양쪽에 다른 테이블 별칭을 지정해야 한다는 점이에요. 이 예시에서는 AS true_originalAS new 둘 다 필요해요.

UPDATE original AS true_original
    SET value = (
        SELECT
            new.value || ' a change!' AS value
        FROM original AS new
        WHERE true_original.key = new.key
    );

조인을 사용한 업데이트 (Update Using Joins)

업데이트할 행을 고르기 위해 UPDATE 문은 FROM 절을 사용하고 WHERE 절로 조인을 표현할 수 있어요. 예를 들어:

CREATE TABLE city (name VARCHAR, revenue BIGINT, country_code VARCHAR);
CREATE TABLE country (code VARCHAR, name VARCHAR);
INSERT INTO city VALUES ('Paris', 700, 'FR'), ('Lyon', 200, 'FR'), ('Brussels', 400, 'BE');
INSERT INTO country VALUES ('FR', 'France'), ('BE', 'Belgium');

프랑스의 모든 도시 수익을 올리려면 citycountry 테이블을 조인하고 후자로 필터링해요:

UPDATE city
SET revenue = revenue + 100
FROM country
WHERE city.country_code = country.code
  AND country.name = 'France';
SELECT *
FROM city;
name revenue country_code
Paris 800 FR
Lyon 300 FR
Brussels 400 BE

Upsert (삽입 또는 업데이트)

자세한 내용은 Insert 문서를 참고해요.

더 알아보기 (Learn more)