본문 바로가기
WIKI 기술 지식 베이스

REPLACE

원문 보기 위키 갱신

행을 삽입하되, 유니크 제약 조건에서 충돌하는 기존 행이 있으면 그 행을 대체하는 REPLACE 문이에요. INSERT OR REPLACE와 완전히 동일한 축약형이라고 기억하면 돼요.

출처: 문서

본문

REPLACE 문은 테이블에 행을 삽입해요. 그 행이 UNIQUE나 PRIMARY KEY 제약 조건을 위반하면, 기존의 충돌 행을 삭제한 다음 새 행을 삽입해요.

Syntax

REPLACE INTO table-name [(column-name [, column-name ...])]
VALUES (expression [, expression ...]) [, (expression [, expression ...]) ...]

REPLACE INTO table-name [(column-name [, column-name ...])]
select-statement

Description

REPLACE는 INSERT OR REPLACE와 동일해요. REPLACE가 UNIQUE나 PRIMARY KEY 제약 조건을 위반할 행을 삽입하면 충돌을 일으키는 기존 행을 삭제한 뒤 새 행을 삽입해요. 제약 조건 위반이 없으면 REPLACE는 INSERT와 똑같이 동작해요.

How REPLACE Differs from INSERT

일반 INSERT는 제약 조건 위반이 발생하면 오류와 함께 실패해요. REPLACE는 충돌 행을 조용히 삭제하고 새 행이 그 자리를 차지해요.

충돌 행이 먼저 삭제되기 때문에, REPLACE는 기존 행에 DELETE 트리거를, 새 행에 INSERT 트리거를 발생시킬 수 있어요.

`REPLACE`는 충돌한 행 전체를 삭제하고 새 행을 삽입해요. 즉 `REPLACE` 문에서 지정하지 않은 컬럼은 삭제된 행의 값이 아니라 기본값을 받아요. 기존 컬럼 값을 유지하면서 특정 컬럼만 갱신하고 싶다면 대신 [INSERT ... ON CONFLICT DO UPDATE](/sql-reference/statements/upsert)를 사용하세요.

Constraint Behavior

테이블에 UNIQUE 제약 조건이 여러 개 있으면 REPLACE는 새 행을 삽입하기 전에 새 행과 충돌하는 모든 행을 삭제해요. 그래서 하나의 REPLACE 연산으로 여러 행이 삭제될 수 있어요.

DEFAULT 값이 없는 컬럼에서 NOT NULL 제약 조건을 위반하면 REPLACE는 오류와 함께 실패해요.

Examples

Basic REPLACE

CREATE TABLE settings (key TEXT PRIMARY KEY, value TEXT);

INSERT INTO settings VALUES ('theme', 'light');
SELECT * FROM settings;
-- theme|light

-- 기존 행이 삭제되고 새 행이 삽입돼요
REPLACE INTO settings VALUES ('theme', 'dark');
SELECT * FROM settings;
-- theme|dark

REPLACE deletes and re-inserts

UPDATE와 달리 REPLACE는 기존 행을 완전히 제거해요. 문장에서 지정하지 않은 컬럼은 기본값을 받아요.

CREATE TABLE users (
    id INTEGER PRIMARY KEY,
    name TEXT NOT NULL,
    email TEXT UNIQUE,
    created_at TEXT DEFAULT (datetime('now'))
);

INSERT INTO users VALUES (1, 'Alice', '[email protected]', '2025-01-01');

-- id=1인 행을 삭제하고 완전히 새로운 행을 삽입해요.
-- created_at 컬럼은 '2025-01-01'이 아니라 DEFAULT 값을 받아요.
REPLACE INTO users (id, name, email) VALUES (1, 'Alice', '[email protected]');

SELECT id, name, email FROM users;
-- 1|Alice|[email protected]

Multi-row REPLACE

CREATE TABLE inventory (sku TEXT PRIMARY KEY, quantity INTEGER);
INSERT INTO inventory VALUES ('A001', 10);
INSERT INTO inventory VALUES ('B002', 20);

REPLACE INTO inventory VALUES
    ('A001', 15),
    ('B002', 25),
    ('C003', 30);

SELECT * FROM inventory;
-- A001|15
-- B002|25
-- C003|30

See Also

  • INSERT for adding rows without conflict resolution
  • INSERT ... ON CONFLICT for conditional insert-or-update with control over which columns are updated
  • UPDATE for modifying existing rows in place

더 알아보기 (Learn more)