INSERT
INSERT (multi-table)
(쿼리의) 열 값이 포함된 하나 이상의 행을 여러 테이블에 삽입하여 여러 테이블을 업데이트하는 명령이에요. 무조건(unconditional) 삽입과 조건부(conditional) 삽입을 모두 지원해요.
출처: 문서
본문
구문 (Syntax)
-- Unconditional multi-table insert
INSERT [ OVERWRITE ] ALL
intoClause [ ... ]
-- Conditional multi-table insert
INSERT [ OVERWRITE ] { FIRST | ALL }
{ WHEN <condition> THEN intoClause [ ... ] }
[ ... ]
[ ELSE intoClause ]
여기서:
intoClause ::=
INTO <target_table> [ ( <target_col_name> [ , ... ] ) ] [ VALUES ( { <source_col_name> | DEFAULT | NULL } [ , ... ] ) ]
필수 파라미터 (Required parameters)
- ALL — 무조건 다중 테이블 삽입 전용. 각 행이 INSERT 문장의 모든 INTO 절을 실행함을 지정해요. 참고: 무조건 다중 테이블 삽입에서 FIRST 키워드가 지정되면(또는 ALL 키워드가 지정되지 않으면) Snowflake는 구문 오류를 반환해요.
- FIRST 또는 ALL — 조건부 다중 테이블 삽입 전용.
FIRST— 각 행이 조건이 TRUE로 평가되는 첫 번째 WHEN 절만 실행함을 지정해요. 어떤 WHEN 절도 TRUE로 평가되지 않으면, 있으면 ELSE 절이 실행돼요.ALL— 각 행이 모든 WHEN 절을 실행함을 지정해요. 어떤 WHEN 절도 TRUE로 평가되지 않으면, 있으면 ELSE 절이 실행돼요.
참고:
- 조건부 다중 테이블 삽입은 최소한 하나의 WHEN 절을 포함해야 해요.
- 각 WHEN 절은 여러 INTO 절을 포함할 수 있고, INTO 절은 같은 대상 테이블에 삽입할 수 있어요.
- WHEN 절을 항상 실행하려면 다음을 사용해요:
WHEN 1=1 THEN ...
- condition — 조건부 다중 테이블 삽입 전용. INTO 절에 지정된 값이 삽입되기 위해 TRUE로 평가되어야 하는 조건을 지정해요. 조건은 SELECT 목록일 수 있어요.
- target_table — 행을 삽입할 대상 테이블을 지정해요. 같은 테이블을 (별도의 WHEN 절에서) 한 번 이상 참조할 수 있어요. 각 테이블에 대한 INTO 절을 포함하여 여러 테이블을 대상으로 할 수 있어요.
- subquery — 대상 테이블에 삽입할 값의 소스를 결정하는 SELECT 목록을 지정해요.
선택 파라미터 (Optional parameters)
- OVERWRITE — 테이블에 삽입하기 전에 대상 테이블을 잘라내면서 테이블의 접근 제어 권한을 유지함을 지정해요. OVERWRITE가 있는 INSERT 문장은 현재 트랜잭션 범위 내에서 처리될 수 있어, 다음과 같은 트랜잭션을 커밋하는 DDL 문장을 피할 수 있어요:
DROP TABLE t;
CREATE TABLE t AS SELECT * FROM ... ;
기본값: 없음(삽입 전 대상 테이블을 잘라내지 않음).
- ( target_col_name [ , ... ] ) — 소스의 해당 열에서 값이 삽입되는 대상 테이블의 하나 이상의 열을 지정해요. 지정된 대상 열의 수는 소스에 지정된 값의 수와 일치해야 해요. 기본값: 없음(대상 테이블의 모든 열이 업데이트됨).
- VALUES ( source_col_name | DEFAULT | NULL [ , ... ] ) — 대상 테이블의 해당 열에 삽입할 하나 이상의 값을 지정해요. 값은:
source_col_name: 대상 테이블의 해당 열에 삽입할 값을 포함하는 소스의 열을 지정해요.DEFAULT: 대상 테이블의 해당 열에 대한 기본값을 삽입해요.NULL: NULL 값을 삽입해요. 절의 각 값은 쉼표로 구분해야 해요. 또한 지정된 값의 수는 대상 테이블에 지정된 열의 수와 일치해야 해요. 기본값: 없음(소스의 모든 열의 값이 대상 테이블의 해당 열에 삽입됨).
사용 메모 (Usage notes)
- INTO 절에서 VALUES 절은 선택 사항이에요. 생략하면 SELECT 목록의 값이 자연 순서로 대상 테이블에 삽입돼요.
- WHEN 절(조건부 다중 테이블 삽입)과 VALUES 절의 표현식은 별칭을 통해 하위 쿼리만 참조할 수 있어요. 별칭은 다음 중 하나여야 해요:
- SELECT 표현식에 대해 지정된 명시적 별칭.
- 표현식의 기본 별칭.
- 위치 별칭($1, $2 등). 또한 최외곽 SELECT 목록에 없는 하위 쿼리의 열과 표현식은 WHEN 및 VALUES 절에서 참조할 수 없어요.
- 하위 쿼리가 생성하는 각 행에서 source_col_name의 값은 해당 target_col_name의 데이터 유형과 호환되어야 해요. 이 규칙은 WHEN 절의 조건에 의해 걸러질 행에도 적용돼요. 작업 순서는 WHEN 절의 필터가 source_col_name의 값을 데이터 유형 호환성에 대해 평가하기 전에 적용됨을 보장하지 않아요.
예시 (Examples)
무조건 다중 테이블 삽입 (Unconditional multi-table inserts)
src 테이블의 각 행을 t1과 t2 테이블에 두 번 삽입해요. 이 예시에서 VALUES 절을 사용하여 데이터를 다르게 하므로 삽입된 행은 동일하지 않아요:
INSERT ALL
INTO t1
INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT)
INTO t2 (c1, c2, c3)
INTO t2 VALUES (n3, n2, n1)
SELECT n1, n2, n3 from src;
-- If t1 and t2 need to be truncated before inserting, OVERWRITE must be specified
INSERT OVERWRITE ALL
INTO t1
INTO t1 (c1, c2, c3) VALUES (n2, n1, DEFAULT)
INTO t2 (c1, c2, c3)
INTO t2 VALUES (n3, n2, n1)
SELECT n1, n2, n3 from src;
조건부 다중 테이블 삽입 (Conditional multi-table inserts)
다음 두 예시는 WHEN 절과 ELSE 절을 사용하여 각 행이 삽입되는 테이블(있는 경우)을 결정하는 조건부 다중 테이블 삽입을 만드는 방법을 보여줘요. 이 예시들은 INSERT ALL과 INSERT FIRST 사용의 차이도 보여줘요.
ELSE 절로 모든 WHEN 절 실행:
- n1 > 100인 행은 n1 > 10 조건도 만족하므로 ALL 키워드를 사용할 때 t1에 두 번 삽입돼요.
- n1 <= 10인 행은 ELSE 경우를 만족하며 t2에 삽입돼요.
INSERT ALL
WHEN n1 > 100 THEN
INTO t1
WHEN n1 > 10 THEN
INTO t1
INTO t2
ELSE
INTO t2
SELECT n1 from src;
src 테이블이 n1 값이 1, 11, 101인 3행을 포함하면, INSERT 문장 후 t1과 t2 테이블은 아래 표시된 값을 보유해요:
- t1:
- 101 — 101 > 100이므로 첫 번째 WHEN 절이 t1에 삽입.
- 101 — 101 > 10이므로 두 번째 WHEN 절도 t1에 삽입.
- 11 — 11 > 10이므로 두 번째 WHEN 절이 t1에 삽입. n1 = 1인 행은 t1에 삽입되는 WHEN 절을 만족하지 않고, ELSE 절도 t1에 삽입하지 않으므로 t1에 삽입되지 않아요.
- t2:
- 101 — 101 > 10이므로 두 번째 WHEN 절이 t2에 삽입. (행이 WHEN n1 > 100 절에도 해당하지만 그 절은 t2에 삽입하지 않아요.)
- 11 — 11 > 10이므로 두 번째 WHEN 절이 t2에 삽입.
- 1 — 행이 어떤 WHEN 절도 만족하지 않았으므로 ELSE 절로 t2에 삽입.
다음 예시는 FIRST 절이 있는 것을 제외하면 이전 예시와 유사해요:
INSERT FIRST
WHEN n1 > 100 THEN
INTO t1
WHEN n1 > 10 THEN
INTO t1
INTO t2
ELSE
INTO t2
SELECT n1 from src;
src 테이블이 n1 값이 1, 11, 101인 3행을 포함하면 INSERT 문장 후 t1과 t2 테이블은 아래 표시된 값을 보유해요:
- t1:
- 101 — 101 > 100이므로 첫 번째 WHEN 절이 t1에 삽입.
- 11 — 11 > 10이므로 두 번째 WHEN 절이 t1에 삽입. n1 = 1인 행은 t1에 삽입되는 WHEN 절을 만족하지 않고, ELSE 절도 t1에 삽입하지 않으므로 t1에 삽입되지 않아요. ALL을 사용한 이전 예시와 달리 n1 = 101인 행은 첫 번째 WHEN 절이 TRUE로 평가되므로 두 번째 WHEN 절이 무시되어 t1에 한 번만 삽입돼요.
- t2:
- 11 — 11 > 10이므로 두 번째 WHEN 절이 t2에 삽입.
- 1 — 행이 어떤 WHEN 절도 만족하지 않았으므로 ELSE 절로 t2에 삽입. n1 = 101인 행은 101이 100보다 크므로 첫 번째 WHEN 절과 일치하지만, 첫 번째 WHEN 절은 t2에 삽입하지 않고, 문장은 행이 이미 첫 번째 WHEN 절에 해당했으므로 다른 WHEN 절이나 ELSE 절을 확인하지 않기 때문에 t2에 삽입되지 않아요.
별칭과 참조가 있는 다중 테이블 삽입
위치 별칭($1), 명시적 별칭(an_alias), 기본 별칭("10 + 20")을 사용하여 값을 삽입해요. 이 예시는 값 (1, 50, 30)을 가진 단일 행을 t1 테이블에 삽입해요:
INSERT ALL
INTO t1 VALUES ($1, an_alias, "10 + 20")
SELECT 1, 50 AS an_alias, 10 + 20;
참조하려면 선택해야 하는 열의 값을 삽입하는 방법을 보여줘요(src 테이블의 b와 c):
-- Returns error
INSERT ALL
WHEN c > 10 THEN
INTO t1 (col1, col2) VALUES (a, b)
SELECT a FROM src;
-- Completes successfully
INSERT ALL
WHEN c > 10 THEN
INTO t1 (col1, col2) VALUES (a, b)
SELECT a, b, c FROM src;
참조할 수 없는 열(src1.key)의 값을 삽입하는 방법을 보여줘요. 대신 선택하고 별칭을 지정해야 해요:
-- Returns error
INSERT ALL
INTO t1 VALUES (src1.key, a)
SELECT src1.a AS a
FROM src1, src2 WHERE src1.key = src2.key;
-- Completes successfully
INSERT ALL
INTO t1 VALUES (key, a)
SELECT src1.key AS key, src1.a AS a
FROM src1, src2 WHERE src1.key = src2.key;