INSERT

적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks 런타임

테이블에 새 행을 삽입하고 선택적으로 테이블 또는 파티션을 자릅니다. 값 식 또는 쿼리 결과로 삽입된 행을 지정합니다.

Databricks SQL에서는 Delta Lake 테이블에 대해서만 이 문을 지원합니다.

Syntax

INSERT { OVERWRITE | INTO } [ TABLE ] table_name
    [ PARTITION clause ]
    [ ( column_name [, ...] ) | BY NAME ]
    query

INSERT INTO [ TABLE ] table_name
    REPLACE WHERE predicate
    query

참고 항목

Delta 테이블에 INSERT INTO하는 경우 스키마 적용 및 진화가 지원됩니다. 열의 데이터 형식을 Delta 테이블의 데이터 형식으로 안전하게 캐스트할 수 없는 경우 Runtime 예외가 throw됩니다. 스키마 진화를 사용하도록 설정하면 스키마가 진화할 스키마의 마지막 열(또는 중첩 열)로 새 열이 존재할 수 있습니다.

매개 변수

  • INTO 또는 OVERWRITE

    OVERWRITE를 지정하면 다음이 적용됩니다.

    • partition_spec이 없으면 첫 번째 행을 삽입하기 전에 테이블이 잘립니다.
    • 그렇지 않으면 첫 번째 행을 삽입하기 전에 partition_spec과 일치하는 모든 파티션이 잘립니다.

    INTO를 지정하면 삽입되는 모든 행이 기존 행에 추가됩니다.

  • table_name

    삽입할 테이블을 식별합니다. 이름에는 임시 사양이 포함되지 않아야 합니다. 테이블을 찾을 수 없는 경우 Azure Databricks는 TABLE_OR_VIEW_NOT_FOUND 오류를 발생시킵니다.

    table_name 는 외세 테이블이 아니어야 합니다.

  • PARTITION 절

    삽입을 위한 대상 파티션을 지정하는 선택적 매개 변수입니다. 파티션을 부분적으로만 지정할 수도 있습니다.

    정적 파티션 column = value를 지정할 때 이 열은 삽입 열 목록에서 반복되지 않아야 합니다.

  • ( column_name [, …] )

    테이블의 선택적 열 목록입니다. insert 명령은 최대 한 번만 테이블의 특정 열을 지정할 수 있습니다.

    적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 12.2 LTS 이상

    • 이 명령이 열을 생략하는 경우 Databricks SQL은 대신 해당 기본값을 할당합니다.
    • 대상 테이블 스키마가 삽입된 열에 대한 기본값을 정의하지 않는 경우 Databricks SQL은 열이 null을 허용하는 경우 NULL을 할당합니다. 그렇지 않으면 Databricks SQL에서 오류가 발생합니다.

    열 목록을 제공하지 않는 것은 테이블에 정의된 순서대로 PARTITION 절에 값이 할당된 열을 제외하고 모든 열을 할당하는 것과 같습니다.

  • BY NAME

    적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 13.3 LTS 이상

    명시적 열 목록 대신 이 절을 사용하는 경우 명령은 노출된 열 이름을 query 사용하여 열 목록을 순서대로 query생성합니다. 명시적 열 목록과 마찬가지로 각 열은 대상 테이블에 있어야 하며 중복되어서는 안 됩니다. 포함된 table_name 열이 암시적 열 목록의 일부가 아닌 경우 값이 DEFAULT 대신 사용됩니다.

    BY NAME 또한 이름별로 구조체의 특성과 일치합니다.

    열이 절에 query 지정된 PARTITION 열이나 생성된 열과 일치할 수 없습니다.

  • REPLACE WHERE boolean_expression

    적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 12.2 LTS 이상

    table_name이 Delta Lake 테이블인 경우 query에 지정된 boolean-expression에 일치하는 행을 삽입하기 전에 boolean_expression에 일치하는 행을 삭제합니다. boolean_expression에 일치하지 않는 query의 행은 무시됩니다.

    boolean_expression은 결과 형식 BOOLEAN으로 계산되는 모든 식일 수 있습니다.

    replaceWhere를 사용하여 임의 선택적 덮어쓰기를 참조하세요.

  • query

    삽입할 행을 생성하는 쿼리입니다.

    쿼리에서 반환된 열 수를 지정되거나 암시된 삽입 열 목록과 일치시켜야 합니다.

    데이터 형식이 일치하는 열 데이터 형식으로 안전하게 캐스트될 수 없는 경우 런타임 예외가 throw됩니다.

    적용 대상:검사 '예'로 표시 Databricks SQL 검사 '예'로 표시 Databricks Runtime 11.3 LTS 이상

    • queryVALUES 절로 구성된 경우 expressionDEFAULT일 수 있습니다.
    • querySELECT 절로 구성된 경우 named_expressionDEFAULT일 수 있습니다.
    • DEFAULTtable_name에 해당 열의 명시적으로 정의된 DEFAULT 식을 삽입하거나 정의되지 않은 경우 NULL을 삽입합니다.

    스키마 진화를 사용하도록 설정하면 스키마가 진화할 스키마의 마지막 열(또는 중첩 열)로 새 열이 존재할 수 있습니다.

예제

이 섹션의 내용:

INSERT INTO

VALUES를 사용한 INSERT

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64) DEFAULT 'unknown', student_id INT)
  PARTITIONED BY (student_id);

-- Single row insert using a `VALUES` clause specifying all columns.
> INSERT INTO students VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);

-- Single row insert using an implicit default for address
> INSERT INTO students(name, student_id) VALUES('Grayson Miller', 222222);

-- Single row insert using an explicit DEFAULT keyword for address
> INSERT INTO students VALUES('Youna Kim', DEFAULT, 333333);

--  Multi-row insert using a `VALUES` clause
> INSERT INTO students VALUES
    ('Bob Brown', '456 Taylor St, Cupertino', 444444),
    ('Cathy Johnson', '789 Race Ave, Palo Alto', 555555);

-- Multi-row insert using a mix of DEFAULT and literals
> INSERT INTO students VALUES
    ('Gwyneth Zhao', '120 Main St, Rockport', 666666),
    ('Jackson Peterson', DEFAULT, 777777);

> SELECT * FROM students;
            name                  address student_id
 ---------------- ------------------------ ----------
        Amy Smith   123 Park Ave, San Jose     111111
   Grayson Miller                  unknown     222222
        Youna Kim                  unknown     333333
        Bob Brown 456 Taylor St, Cupertino     444444
    Cathy Johnson  789 Race Ave, Palo Alto     555555
     Gwyneth Zhao    120 Main St, Rockport     666666
 Jackson Peterson                  unknown     777777

하위 쿼리를 사용하여 삽입

-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
          name                   address       ssn
 ------------- ------------------------- ---------
 Dora Williams 134 Forest Ave, Melo Park 123456789
   Eddie Davis   245 Market St, Milpitas 345678901

> INSERT INTO students PARTITION (student_id = 444444)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444

TABLE 절을 사용하여 삽입

-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

> INSERT INTO students TABLE visiting_students;

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith     123 Park Ave,San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444
 Fleur Laurent     345 Copper St, London     777777
 Gordon Martin      779 Lake Ave, Oxford     888888

디렉터리에 삽입

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/mnt/user1/students";

> INSERT INTO delta.`/mnt/user1/students` VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111

열 목록을 사용하여 삽입

> INSERT INTO students (address, name, student_id) VALUES
    ('Hangzhou, China', 'Kent Yao', 11215016);
> SELECT * FROM students WHERE name = 'Kent Yao';
      name                address student_id
 --------- ---------------------- ----------
 Kent Yao         Hangzhou, China   11215016

파티션 사양과 열 목록을 모두 사용하여 삽입

> INSERT INTO students PARTITION (student_id = 11215017) (address, name) VALUES
    ('Hangzhou, China', 'Kent Yao Jr.');
> SELECT * FROM students WHERE student_id = 11215017;
         name                address student_id
 ------------ ---------------------- ----------
 Kent Yao Jr.        Hangzhou, China   11215017

BY NAME 절을 사용하는 INSERT

> CREATE TABLE target(n INT, text STRING, s STRUCT<a INT, b INT>);
> INSERT INTO target BY NAME SELECT named_struct('b', 2, 'a', 1) AS s, 0 AS n, 'data' AS text;
> SELECT * FROM target;
  0  data  {"a":1,"b":2}

> CREATE OR REPLACE TABLE target(n INT, arr ARRAY<STRUCT<a INT, b INT>>);
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n;
> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr;
> SELECT * FROM target;
  0     [{"a":1,"b":2}]
  NULL  [{"a":1,"b":2}]

> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS badname;
Error

> INSERT INTO target BY NAME SELECT array(named_struct('b', 2, 'a', 1)) AS arr, 0 AS n, 1 AS n;
 Error: INSERT_COLUMN_ARITY_MISMATCH.TOO_MANY_DATA_COLUMNS

REPLACE WHERE

> CREATE TABLE sales(tx_date DATE, amount INTEGER);
> INSERT INTO sales VALUES
   (DATE'2022-10-01', 1234),
   (DATE'2022-10-02', 2345),
   (DATE'2022-10-03', 3456),
   (DATE'2022-11-01', 3214);

-- Replace any rows with a transaction date in October 2022.
> INSERT INTO sales REPLACE WHERE tx_date BETWEEN '2022-10-01' AND '2022-10-31'
   VALUES (DATE'2022-10-01', 1237),
          (DATE'2022-10-02', 2378),
          (DATE'2022-10-04', 2456),
          (DATE'2022-10-05', 6328);
> SELECT * FROM sales ORDER BY  tx_date;
 tx_date    amount
 ---------- ------
 2022-10-01   1237
 2022-10-02   2378
 2022-10-04   2456
 2022-10-05   6328
 2022-11-01   3214

INSERT OVERWRITE

VALUES 절을 사용하여 삽입

-- Assuming the students table has already been created and populated.
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111
     Bob Brown  456 Taylor St, Cupertino     222222
 Cathy Johnson   789 Race Ave, Palo Alto     333333
 Dora Williams 134 Forest Ave, Melo Park     444444
 Fleur Laurent     345 Copper St, London     777777
 Gordon Martin      779 Lake Ave, Oxford     888888
   Helen Davis 469 Mission St, San Diego     999999
    Jason Wang     908 Bird St, Saratoga     121212

> INSERT OVERWRITE students VALUES
    ('Ashua Hill', '456 Erica Ct, Cupertino', 111111),
    ('Brian Reed', '723 Kern Ave, Palo Alto', 222222);

> SELECT * FROM students;
       name                 address student_id
 ---------- ----------------------- ----------
 Ashua Hill 456 Erica Ct, Cupertino     111111
 Brian Reed 723 Kern Ave, Palo Alto     222222

하위 쿼리를 사용하여 삽입

-- Assuming the persons table has already been created and populated.
> SELECT * FROM persons;
          name                   address       ssn
 ------------- ------------------------- ---------
 Dora Williams 134 Forest Ave, Melo Park 123456789
   Eddie Davis    245 Market St,Milpitas 345678901

> INSERT OVERWRITE students PARTITION (student_id = 222222)
    SELECT name, address FROM persons WHERE name = "Dora Williams";

> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
    Ashua Hill   456 Erica Ct, Cupertino     111111
 Dora Williams 134 Forest Ave, Melo Park     222222

TABLE 절을 사용하여 삽입

-- Assuming the visiting_students table has already been created and populated.
> SELECT * FROM visiting_students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

> INSERT OVERWRITE students TABLE visiting_students;

> SELECT * FROM students;
          name               address student_id
 ------------- --------------------- ----------
 Fleur Laurent 345 Copper St, London     777777
 Gordon Martin  779 Lake Ave, Oxford     888888

디렉터리 덮어쓰기 삽입

> CREATE TABLE students (name VARCHAR(64), address VARCHAR(64), student_id INT)
    PARTITIONED BY (student_id)
    LOCATION "/mnt/user1/students";

> INSERT OVERWRITE delta.`/mnt/user1/students` VALUES
    ('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
          name                   address student_id
 ------------- ------------------------- ----------
     Amy Smith    123 Park Ave, San Jose     111111