카테고리:

DML 명령 - 일반

INSERT

테이블에 하나 이상의 행을 삽입하여 테이블을 업데이트합니다. 테이블의 각 열에 삽입된 값은 명시적으로 지정된 값이거나 쿼리의 결과일 수 있습니다.

참고 항목:

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" }');
    

쿼리를 사용한 단일 행 삽입

세 문자열 값을 날짜 또는 타임스탬프로 변환해 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       |
+------------+-----------+----------------+---------------+-------------+
맨 위로 이동