INSERT
적용 대상: Databricks SQL Databricks Runtime
테이블에 새 행을 삽입하고 선택적으로 테이블 또는 파티션을 자릅니다. 값 식 또는 쿼리 결과로 삽입된 행을 지정합니다.
형식이 테이블 스키마에 있는 경우 timestamp-millis
Databricks는 Hive Avro 테이블을 지원하지 INSERT
않습니다.
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
를 지정하면 삽입되는 모든 행이 기존 행에 추가됩니다.-
삽입할 테이블을 식별합니다. 이름에는 임시 사양이 포함되지 않아야 합니다. 테이블을 찾을 수 없는 경우 Azure Databricks는 TABLE_OR_VIEW_NOT_FOUND 오류를 발생시킵니다.
table_name
는 외세 테이블이 아니어야 합니다.적용 대상: Databricks SQL Databricks Runtime 16.0 이상
table_name
옵션 사양을 포함할 수 있습니다. -
삽입을 위한 대상 파티션을 지정하는 선택적 매개 변수입니다. 파티션을 부분적으로만 지정할 수도 있습니다.
정적 파티션()
column = value
을 지정할 때 이 열은 삽입 열 목록에서 반복하면 안 됩니다.동적 파티션
INSERT OVERWRITE
을 지정할 때 Deltatable_name
Lake 테이블이어야 합니다. ( 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를 사용하여 임의 선택적 덮어쓰기를 참조하세요.
-
삽입할 행을 생성하는 쿼리입니다.
쿼리에서 반환된 열 수를 지정되거나 암시된 삽입 열 목록과 일치시켜야 합니다.
데이터 형식이 일치하는 열 데이터 형식으로 안전하게 캐스트될 수 없는 경우 런타임 예외가 throw됩니다.
적용 대상: Databricks SQL Databricks Runtime 11.3 LTS 이상
query
가 VALUES 절로 구성된 경우expression
은DEFAULT
일 수 있습니다.query
가 SELECT 절로 구성된 경우named_expression
은DEFAULT
일 수 있습니다.DEFAULT
는table_name
에 해당 열의 명시적으로 정의된DEFAULT
식을 삽입하거나 정의되지 않은 경우NULL
을 삽입합니다.
스키마 진화를 사용하도록 설정하면 스키마가 진화할 스키마의 마지막 열(또는 중첩 열)로 새 열이 존재할 수 있습니다.
예제
이 구역의 내용:
- INSERT INTO
- 열 목록을 사용하여 삽입
- 파티션 사양과 열 목록을 모두 사용하여 삽입
- BY NAME 절을 사용하는 INSERT
- REPLACE WHERE
- INSERT OVERWRITE
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
-- 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
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 "/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