INSERT¶
테이블에 하나 이상의 행을 삽입하여 테이블을 업데이트합니다. 테이블의 각 열에 삽입된 값은 명시적으로 지정된 값이거나 쿼리의 결과일 수 있습니다.
- 참고 항목:
구문¶
INSERT [ OVERWRITE ] INTO <target_table> [ ( <target_col_name> [ , ... ] ) ]
{
VALUES ( { <value> | DEFAULT | NULL } [ , ... ] ) [ , ( ... ) ] |
<query>
}
필수 매개 변수¶
target_table
행을 삽입할 대상 테이블을 지정합니다.
VALUES ( value | DEFAULT | NULL [ , ... ] ) [ , ( ... ) ]
대상 테이블의 해당 열에 삽입할 하나 이상의 값을 지정합니다.
VALUES
절에서 다음을 지정할 수 있습니다.value
: 명시적으로 지정된 값을 삽입합니다. 값은 리터럴 또는 식일 수 있습니다.DEFAULT
: 대상 테이블에서 해당 열의 기본값을 삽입합니다.NULL
:NULL
값을 삽입합니다.
절에서 각각의 값은 쉼표로 구분해야 합니다.
절에서 추가적인 값 세트를 지정하여 여러 행을 삽입할 수 있습니다. 자세한 내용은 (이 항목에 있는) 사용법 노트 및 예 를 참조하십시오.
query
해당 열에 삽입할 값을 반환하는 쿼리 문을 지정합니다. 이를 통해 하나 이상의 원본 테이블에서 대상 테이블에 행을 삽입할 수 있습니다.
선택적 매개 변수¶
OVERWRITE
대상 테이블을 자른 후에 테이블에 값을 삽입해야 하는 것으로 지정합니다. 이 옵션을 지정해도 테이블에 대한 액세스 제어 권한에는 영향을 미치지 않습니다.
OVERWRITE
를 포함한 INSERT 문을 현재 트랜잭션 범위 내에서 처리하면 다음과 같이 트랜잭션을 커밋하는 DDL 문을 방지할 수 있습니다.DROP TABLE t; CREATE TABLE t AS SELECT * FROM ... ;
기본값: 값 없음(삽입을 수행하기 전에 대상 테이블이 잘리지 않음).
( target_col_name [ , ... ] )
해당 값이 삽입되는 대상 테이블에서 하나 이상의 열을 지정합니다. 지정된 대상 열의 수가
VALUES
절에 지정된 값 또는 열(값이 쿼리의 결과인 경우)의 수와 일치해야 합니다.기본값: 값 없음(대상 테이블의 모든 열이 업데이트됨).
사용법 노트¶
단일 INSERT 명령을 사용하여
VALUES
절에서 쉼표로 구분된 값 세트를 추가로 지정하여 테이블에 여러 행을 삽입할 수 있습니다.예를 들어 다음 절은 3열 테이블에 3개의 행을 삽입하는데, 처음 두 행에는 값
1
,2
,3
을 삽입하고 세 번째 행에는 값2
,3
,4
를 삽입합니다.VALUES ( 1, 2, 3 ) , ( 1, 2, 3 ) , ( 2, 3, 4 )
INSERT에 OVERWRITE 옵션을 사용하려면, OVERWRITE가 테이블의 기존 레코드를 삭제할 것이므로 테이블에 대한 DELETE 권한을 가진 역할을 사용해야 합니다.
일부 식은 VALUES 절에 지정할 수 없습니다. 또는 쿼리 절에 이 식을 지정하십시오. 예를 들어
INSERT INTO table1 (ID, varchar1, variant1) VALUES (4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }'));
위 절을 아래 절로 바꿀 수 있습니다.
INSERT INTO table1 (ID, varchar1, variant1) SELECT 4, 'Fourier', PARSE_JSON('{ "key1": "value1", "key2": "value2" }');
VALUES 절은 16,384행으로 제한됩니다. 이 제한은 단일 INSERT INTO … VALUES 문과 단일 INSERT INTO … SELECT … FROM VALUES 문에 적용됩니다. 대량 데이터 로드를 수행하려면 COPY INTO <테이블> 명령을 사용하는 것이 좋습니다. SELECT 문에서 VALUES 절을 사용하는 방법에 대한 자세한 내용은 VALUES 섹션을 참조하십시오.
하이브리드 테이블에 데이터를 삽입하는 방법에 대한 자세한 내용은 데이터 로딩하기 섹션을 참조하십시오.
예¶
쿼리를 사용한 단일 행 삽입¶
세 문자열 값을 날짜 또는 타임스탬프로 변환해 mytable
테이블의 단일 행에 삽입합니다.
DESC TABLE mytable; +------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+ | name | type | kind | null? | default | primary key | unique key | check | expression | comment | |------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------| | COL1 | DATE | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | | COL2 | TIMESTAMP_NTZ(9) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | | COL3 | TIMESTAMP_NTZ(9) | COLUMN | Y | NULL | N | N | NULL | NULL | NULL | +------+------------------+--------+-------+---------+-------------+------------+-------+------------+---------+ INSERT INTO mytable SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123'); SELECT * FROM mytable; +------------+-------------------------+-------------------------+ | COL1 | COL2 | COL3 | |------------+-------------------------+-------------------------| | 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 | +------------+-------------------------+-------------------------+
이전 예와 유사하지만, 테이블의 첫째 열과 셋째 열만 업데이트하도록 지정합니다.
INSERT INTO mytable (col1, col3) SELECT TO_DATE('2013-05-08T23:39:20.123'), TO_TIMESTAMP('2013-05-08T23:39:20.123'); SELECT * FROM mytable; +------------+-------------------------+-------------------------+ | COL1 | COL2 | COL3 | |------------+-------------------------+-------------------------| | 2013-05-08 | 2013-05-08 23:39:20.123 | 2013-05-08 23:39:20.123 | | 2013-05-08 | NULL | 2013-05-08 23:39:20.123 | +------------+-------------------------+-------------------------+
명시적으로 지정된 값을 사용한 다중 행 삽입¶
VALUES
절에서 쉼표로 구분된 목록에 값 세트를 모두 제공하여 employees
테이블에 두 개의 데이터 행을 삽입합니다.
SELECT * FROM employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | May | Franklin | 1-650-249-5198 | San Francisco | 94115 | | Gillian | Patterson | 1-650-859-3954 | San Francisco | 94115 | +------------+-----------+----------------+---------------+-------------+ INSERT INTO employees VALUES ('Lysandra','Reeves','1-212-759-3751','New York',10018), ('Michael','Arnett','1-650-230-8467','San Francisco',94116); SELECT * FROM employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | May | Franklin | 1-650-249-5198 | San Francisco | 94115 | | Gillian | Patterson | 1-650-859-3954 | San Francisco | 94115 | | Lysandra | Reeves | 1-212-759-3751 | New York | 10018 | | Michael | Arnett | 1-650-230-8467 | San Francisco | 94116 | +------------+-----------+----------------+---------------+-------------+
다중 행 삽입에서는 첫 번째 행의 데이터 타입이 가이드로 사용되므로 삽입된 값의 데이터 타입이 행 간에 일관되도록 하십시오. 두 값 모두 테이블에 있는 열의 데이터 타입인 VARCHAR로 강제 변환될 수 있지만, 두 번째 행에 있는 값의 데이터 타입이 첫 번째 행에 있는 값의 데이터 타입과 다르므로 다음 삽입이 실패합니다.
CREATE TABLE t1 (v VARCHAR); -- works as expected. INSERT INTO t1 (v) VALUES ('three'), ('four'); -- Fails with error "Numeric value 'd' is not recognized" -- even though the data type of 'd' is the same as the -- data type of the column v. INSERT INTO t1 (v) VALUES (3), ('d');
쿼리를 사용한 다중 행 삽입¶
contractors
테이블의 여러 데이터 행을 employees
테이블에 삽입합니다.
worknum
열에 지역 번호650
이 포함된 행만 선택합니다.
city
열에 NULL 값을 삽입합니다.SELECT * FROM employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | May | Franklin | 1-650-249-5198 | San Francisco | 94115 | | Gillian | Patterson | 1-650-859-3954 | San Francisco | 94115 | | Lysandra | Reeves | 1-212-759-3751 | New York | 10018 | | Michael | Arnett | 1-650-230-8467 | San Francisco | 94116 | +------------+-----------+----------------+---------------+-------------+ SELECT * FROM contractors; +------------------+-----------------+----------------+---------------+----------+ | CONTRACTOR_FIRST | CONTRACTOR_LAST | WORKNUM | CITY | ZIP_CODE | |------------------+-----------------+----------------+---------------+----------| | Bradley | Greenbloom | 1-650-445-0676 | San Francisco | 94110 | | Cole | Simpson | 1-212-285-8904 | New York | 10001 | | Laurel | Slater | 1-650-633-4495 | San Francisco | 94115 | +------------------+-----------------+----------------+---------------+----------+ INSERT INTO employees(first_name, last_name, workphone, city,postal_code) SELECT contractor_first,contractor_last,worknum,NULL,zip_code FROM contractors WHERE CONTAINS(worknum,'650'); SELECT * FROM employees; +------------+------------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+------------+----------------+---------------+-------------| | May | Franklin | 1-650-249-5198 | San Francisco | 94115 | | Gillian | Patterson | 1-650-859-3954 | San Francisco | 94115 | | Lysandra | Reeves | 1-212-759-3751 | New York | 10018 | | Michael | Arnett | 1-650-230-8467 | San Francisco | 94116 | | Bradley | Greenbloom | 1-650-445-0676 | NULL | 94110 | | Laurel | Slater | 1-650-633-4495 | NULL | 94115 | +------------+------------+----------------+---------------+-------------+
공통 테이블 식을 사용하여 contractors
테이블의 여러 데이터 행을 employees
테이블에 삽입합니다.
INSERT INTO employees (first_name,last_name,workphone,city,postal_code) WITH cte AS (SELECT contractor_first AS first_name,contractor_last AS last_name,worknum AS workphone,city,zip_code AS postal_code FROM contractors) SELECT first_name,last_name,workphone,city,postal_code FROM cte;
원본 테이블의 id
열에 INNER JOIN을 사용하여 두 테이블(emp_addr
, emp_ph
)의 열을 세 번째 테이블(emp
)에 삽입합니다.
INSERT INTO emp (id,first_name,last_name,city,postal_code,ph) SELECT a.id,a.first_name,a.last_name,a.city,a.postal_code,b.ph FROM emp_addr a INNER JOIN emp_ph b ON a.id = b.id;
JSON 데이터의 다중 행 삽입¶
두 JSON 오브젝트를 테이블의 VARIANT 열에 삽입합니다.
INSERT INTO prospects SELECT PARSE_JSON(column1) FROM VALUES ('{ "_id": "57a37f7d9e2b478c2d8a608b", "name": { "first": "Lydia", "last": "Williamson" }, "company": "Miralinz", "email": "lydia.williamson@miralinz.info", "phone": "+1 (914) 486-2525", "address": "268 Havens Place, Dunbar, Rhode Island, 7725" }') , ('{ "_id": "57a37f7d622a2b1f90698c01", "name": { "first": "Denise", "last": "Holloway" }, "company": "DIGIGEN", "email": "denise.holloway@digigen.net", "phone": "+1 (979) 587-3021", "address": "441 Dover Street, Ada, New Mexico, 5922" }');
덮어쓰기를 사용한 삽입¶
이 예에서는 OVERWRITE와 함께 INSERT를 사용해 employees
테이블에 새 레코드가 추가된 후 sf_employees
테이블을 employees
부터 다시 작성합니다.
다음은 두 테이블의 초기 데이터입니다.
SELECT * FROM employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | May | Franklin | 1-650-111-1111 | San Francisco | 94115 | | Gillian | Patterson | 1-650-222-2222 | San Francisco | 94115 | | Lysandra | Reeves | 1-212-222-2222 | New York | 10018 | | Michael | Arnett | 1-650-333-3333 | San Francisco | 94116 | +------------+-----------+----------------+---------------+-------------+ SELECT * FROM sf_employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | Martin | Short | 1-650-999-9999 | San Francisco | 94115 | +------------+-----------+----------------+---------------+-------------+
이 문은 OVERWRITE 절을 사용하여 sf_employees 테이블에 삽입합니다.
INSERT OVERWRITE INTO sf_employees SELECT * FROM employees WHERE city = 'San Francisco';
INSERT가 OVERWRITE 옵션을 사용했으므로, sf_employees의 이전 행이 사라졌습니다.
SELECT * FROM sf_employees; +------------+-----------+----------------+---------------+-------------+ | FIRST_NAME | LAST_NAME | WORKPHONE | CITY | POSTAL_CODE | |------------+-----------+----------------+---------------+-------------| | May | Franklin | 1-650-111-1111 | San Francisco | 94115 | | Gillian | Patterson | 1-650-222-2222 | San Francisco | 94115 | | Michael | Arnett | 1-650-333-3333 | San Francisco | 94116 | +------------+-----------+----------------+---------------+-------------+