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 | +------------+-----------+----------------+---------------+-------------+