적용 대상:
Databricks SQL
Databricks Runtime
테이블에 새 행을 삽입하고 필요에 따라 테이블 또는 파티션을 자립니다. 값 식 또는 쿼리 결과로 삽입된 행을 지정합니다.
형식이 테이블 스키마에 있는 경우 INSERT Databricks는 Hive Avro 테이블을 지원하지 timestamp-millis 않습니다.
Syntax
[ common_table_expression ]
INSERT { OVERWRITE | INTO } [ TABLE ] table_name
[ PARTITION clause ]
[ ( column_name [, ...] ) | BY NAME ]
query
[ common_table_expression ]
INSERT INTO [ TABLE ] table_name
[ REPLACE WHERE predicate | REPLACE USING ( column_name [, ...] ) ]
query
[ common_table_expression ]
INSERT INTO [ TABLE ] table_name [target_alias]
REPLACE ON boolean_expression
{ (query) [source_alias] | query }
Note
델타 테이블을 INSERT INTO 할 경우, 스키마 적용과 진화가 지원됩니다.
열의 데이터 형식을 델타 테이블의 데이터 형식으로 안전하게 캐스팅할 수 없는 경우 런타임 예외가 throw됩니다.
스키마 진화를 사용하도록 설정하면 스키마가 진화할 스키마의 마지막 열(또는 중첩 열)으로 새 열이 존재할 수 있습니다.
Parameters
-
CTE(공통 테이블 식)는 반복되는 계산을 방지하거나 복잡한 중첩 쿼리의 가독성을 개선하기 위해 주 쿼리 블록 내에서 여러 번 다시 사용할 수 있는 하나 이상의 명명된 쿼리입니다.
INTO또는OVERWRITEOVERWRITE를 지정하면 다음이 적용됩니다.-
partition_spec없으면 첫 번째 행을 삽입하기 전에 테이블이 잘립니다. - 그렇지 않으면 첫 번째 행을 삽입하기 전에
partition_spec과 일치하는 모든 파티션이 잘립니다.
INTO를 지정하면 삽입되는 모든 행이 기존 행에 추가됩니다.-
-
삽입할 테이블을 식별합니다. 이름에는 임시 사양이 포함되지 않아야 합니다. 테이블을 찾을 수 없는 경우 Azure Databricks는 TABLE_OR_VIEW_NOT_FOUND 오류를 발생시킵니다.
table_name는 외부 테이블이어서는 안 됩니다.적용 대상:예 Databricks Runtime 16.0 이상으로

table_name옵션 사양을 포함할 수 있습니다. -
삽입의 대상 파티션을 지정하는 선택적 매개 변수입니다. 파티션을 부분적으로만 지정할 수도 있습니다.
정적 파티션()
column = value을 지정할 때 이 열은 삽입 열 목록에서 반복하면 안 됩니다.동적 파티션
INSERT OVERWRITE을 지정할 때 Deltatable_nameLake 테이블이어야 합니다. ( 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 WHEREboolean_expression
적용 대상:
Databricks SQL
Databricks Runtime 12.2 LTS 이상으로 표시table_name이 Delta Lake 테이블인 경우,boolean_expression에 지정된boolean-expression와 일치하는 행을 삽입하기 전에query과 일치하는 행을 삭제합니다.query에 일치하지 않는boolean_expression의 행은 무시됩니다.boolean_expression 테이블의 특성만 참조할 수 있습니다.
임의의 선택적 덮어쓰기
replaceWhere를 참조하세요.REPLACE USING ( column_name [, ...] )
적용 대상:
Databricks SQL
Databricks Runtime 16.3 이상지정된 열에서
table_name의 행 중query과 일치하는 행을 원자적으로 삭제하고,query의 행을 삽입합니다. 일치는 테이블의 지정된 열 값과query의 동등성 비교에 기반합니다.Databricks Runtime 16.3~17.1의 경우 이 기능을 사용하려면 지정된 열에 테이블의 모든 파티션 열이 포함되어야 합니다.
Note
JOIN USING와 마찬가지로,REPLACE USING는 일반 같음 비교를 사용하여 행을 일치시키며,NULL값은 어떤 것과도 같지 않은 것으로 간주됩니다.NULL지정된 열에 값이 있는 행은 일치하지 않으므로 대상 테이블에서 제거되지 않습니다.-
삽입할 행을 생성하는 쿼리입니다.
쿼리에서 반환되는 열 수를 지정하거나 암시적인 삽입 열 목록과 일치시켜야 합니다.
데이터 형식을 일치하는 열 데이터 형식으로 안전하게 캐스팅할 수 없는 경우 런타임 예외가 throw됩니다.
적용 대상:
Databricks SQL
Databricks Runtime 11.3 LTS 이상-
query이 VALUES 절로 구성되어 있으면,expressionDEFAULT수있습니다. -
query이 SELECT 절로 구성되어 있으면,named_expressionDEFAULT수있습니다. -
DEFAULT는DEFAULT의 해당 열에 명시적으로 정의된table_name식을 삽입하거나, 정의되지 않았을 경우NULL을 삽입합니다.
스키마 진화를 사용하도록 설정하면 스키마가 진화할 스키마의 마지막 열(또는 중첩 열)으로 새 열이 존재할 수 있습니다.
-
-
에 대한 테이블의 선택적 테이블 별칭입니다
REPLACE ON. 별칭에는 열 목록이 포함되어서는 안 됩니다. boolean_expression에 대한 바꾸기
적용 대상:
Databricks SQL
Databricks Runtime 17.1 이상으로 표시Delta Lake 테이블
table_name인 경우REPLACE ON지정한query따라 행과 일치하는 테이블의 행을 원자 단위로 삭제한 다음 행을query삽입합니다. '의REPLACE WHERE달리REPLACE ONboolean_expression 테이블과 테이블의 열을 참조할query.query비어 있으면 일치시킬 행이 없으므로 삭제가 발생하지 않습니다query.
Examples
이 구역의 내용:
- INSERT 로
- 열 목록을 사용하여 삽입
- 파티션 사양과 열 목록을 모두 사용하여 삽입
- INSERT BY NAME 절 사용
- 교체 WHERE
- USING 바꾸기
- 켜기 바꾸기
- INSERT 덮어쓰기
INSERT 인투
INSERT 사용하여 VALUES
> 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
-- Use an option specification to influence the write behavior
INSERT INTO t WITH ('write.split-size' = 10) SELECT * FROM s;
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 "/path/to/students_table";
> INSERT INTO delta.`/path/to/students_table` 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
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
USING 바꾸기
> CREATE TABLE students (name STRING, country STRING) PARTITIONED BY (country);
> CREATE TABLE new_students (name STRING, country STRING);
> INSERT INTO students VALUES
('Dylan', 'US'),
('Doug', 'UK'),
('Julia', 'IT'),
('David', 'DE'),
('Liz', 'CN'),
('Adam', NULL);
> INSERT INTO new_students VALUES
('Peter', 'FR'),
('Jennie', 'UK'),
('Eva', NULL);
-- Replace any rows in `students` that have matching `country` values in `new_students`.
> INSERT INTO TABLE students
REPLACE USING (country)
SELECT * FROM new_students;
> SELECT * FROM students;
name country
------ -------
Dylan US
Jennie UK
Julia IT
David DE
Liz CN
Peter FR
Adam NULL
Eva NULL
켜기 바꾸기
> CREATE TABLE students (name STRING, row_origin STRING)
> CREATE TABLE people (name STRING, row_origin STRING)
> INSERT INTO students VALUES ('Alice', 'table'), (NULL, 'table'), ('Bob', 'table')
> INSERT INTO people VALUES ('Alice', 'query'), (NULL, 'query'), ('Delta', 'query')
> INSERT INTO TABLE students AS t
REPLACE ON t.name <=> s.name
(SELECT * FROM people) AS s
> SELECT * FROM students
name row_origin
----- ----------
Alice query
NULL query
Bob table
Delta query
INSERT 덮어쓰기
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 "/path/to/students_table";
> INSERT OVERWRITE delta.`/path/to/students_table` VALUES
('Amy Smith', '123 Park Ave, San Jose', 111111);
> SELECT * FROM students;
name address student_id
------------- ------------------------- ----------
Amy Smith 123 Park Ave, San Jose 111111