(c1, c2, c3)를 사용하여 지정할 수 있습니다. 또한 *와 같은 컬럼 matcher 표현식이나 APPLY, EXCEPT, REPLACE와 같은 수정자도 사용할 수 있습니다.
예시로, 다음 테이블을 살펴보겠습니다:
b 컬럼을 제외한 모든 컬럼에 데이터를 삽입하려면 EXCEPT 키워드를 사용할 수 있습니다. 위 구문과 관련해, 지정한 컬럼((c1, c3))의 개수와 삽입하는 값(VALUES (v11, v13))의 개수가 같도록 해야 합니다:
a와 c 컬럼은 전달된 값으로 채워지고, b는 기본적으로 기본값으로 채워지는 것을 확인할 수 있습니다. 또한 DEFAULT 키워드를 사용해 기본값을 삽입할 수도 있습니다:
- 테이블 정의(table definition)에 지정된
DEFAULT표현식으로 계산된 값 DEFAULT표현식이 정의되어 있지 않으면 0과 빈 문자열
INSERT ... VALUES의 기본형과 동일합니다:
INSERT 쿼리에 SETTINGS를 지정하려면 FORMAT 절 앞에 지정해야 합니다. FORMAT format_name 뒤의 모든 내용은 데이터로 처리되기 때문입니다. 예시는 다음과 같습니다.제약 조건
데이터 타입 검증
enable_time_time64_type, allow_suspicious_low_cardinality_types, allow_suspicious_fixed_string_types 등의 설정으로 제어됨)을 테이블 생성(CREATE TABLE) 및 스키마 수정(ALTER TABLE) 시에만 검증하며, INSERT 시에는 검증하지 않습니다.
즉, 허용되지 않는 데이터 타입을 사용하는 테이블이 이미 존재하면 서버에서 해당 설정이 비활성화되어 있어도 그 테이블에 데이터를 삽입할 수 있습니다. 이는 의도된 동작입니다. 테이블이 한 번 생성된 후에는 타입 생성을 제어하는 설정 때문에 삽입이 차단되지 않아야 합니다.
예시:
따라서 최신 버전의 클라이언트(설정이 기본적으로 활성화된 상태)는 대상 테이블에 해당 컬럼 타입이 이미 있는 경우, 더 오래된 버전의 서버(설정이 비활성화된 상태)에 허용되지 않는 데이터 타입의 데이터를 삽입할 수 있습니다. 검증은 DML 수준이 아니라 DDL 수준에서 수행됩니다.
SELECT 결과 삽입
SELECT 절에서의 위치에 따라 매핑됩니다. 하지만 SELECT 표현식에서의 이름과 INSERT 대상 테이블의 이름은 서로 다를 수 있습니다. 필요한 경우 타입 변환이 수행됩니다.
Values 포맷을 제외한 어떤 데이터 포맷에서도 now(), 1 + 2 등과 같은 표현식을 값으로 지정할 수 없습니다. Values 포맷에서는 표현식을 제한적으로 사용할 수 있지만, 이 경우 해당 표현식을 실행할 때 비효율적인 코드가 사용되므로 권장하지 않습니다.
데이터 파트를 수정하는 다른 쿼리는 지원되지 않습니다: UPDATE, DELETE, REPLACE, MERGE, UPSERT, INSERT UPDATE.
하지만 ALTER TABLE ... DROP PARTITION을 사용하여 오래된 데이터를 삭제할 수 있습니다.
SELECT 절에 테이블 함수 input()가 포함된 경우, FORMAT 절은 쿼리의 마지막에 지정해야 합니다.
널을 허용하지 않는 데이터 타입의 컬럼에 NULL 대신 기본값을 삽입하려면 insert_null_as_default 설정을 활성화하십시오.
INSERT는 CTE(common table expression)도 지원합니다. 예를 들어, 다음 두 SQL 문은 동일합니다:
파일에서 데이터 삽입하기
file_name과 type은 문자열 리터럴입니다. 입력 파일 포맷은 FORMAT 절에서 지정해야 합니다.
압축 파일도 지원됩니다. 압축 유형은 파일 이름의 확장자를 기준으로 감지됩니다. 또는 COMPRESSION 절에서 명시적으로 지정할 수도 있습니다. 지원되는 유형은 다음과 같습니다: 'none', 'gzip', 'deflate', 'br', 'xz', 'zstd', 'lz4', 'bz2'.
이 기능은 command-line client 및 clickhouse-local에서 사용할 수 있습니다.
예시
FROM INFILE을 사용한 단일 파일
Query
Response
글롭 패턴을 사용해 FROM INFILE로 여러 파일 처리하기
FROM INFILE 'input_*.csv'를 사용해 여러 파일에서 삽입을 수행합니다.
테이블 함수를 사용한 삽입
Query
Response
ClickHouse Cloud에 삽입하기
INSERT가 성공하면 데이터가 기본 스토리지에 기록됩니다. 하지만 레플리카가 이러한 업데이트를 수신하는 데는 다소 시간이 걸릴 수 있습니다. 따라서 다른 연결을 사용해 다른 레플리카 중 하나에서 SELECT 쿼리를 실행하면 업데이트된 데이터가 아직 반영되지 않았을 수 있습니다.
select_sequential_consistency를 사용하면 레플리카가 최신 업데이트를 강제로 수신하도록 할 수 있습니다. 다음은 이 설정을 사용하는 SELECT 쿼리의 예시입니다.
select_sequential_consistency를 사용하면 ClickHouse Keeper(ClickHouse Cloud에서 내부적으로 사용됨)에 가해지는 부하가 증가하며, 서비스 부하에 따라 성능이 저하될 수 있습니다. 꼭 필요한 경우가 아니라면 이 설정은 활성화하지 않는 것이 좋습니다. 권장되는 방법은 동일한 session에서 읽기/쓰기를 수행하거나, 네이티브 프로토콜을 사용하는 클라이언트 드라이버(즉, 고정 연결을 지원하는 드라이버)를 사용하는 것입니다.
복제된 구성에 데이터 삽입
INSERT 직후 바로 시작되며(즉, 다른 레플리카에서 다운로드됨), 이 동작은 ClickHouse Cloud와 다릅니다. ClickHouse Cloud에서는 데이터가 즉시 공유 스토리지에 기록되고, 레플리카는 메타데이터 변경 사항을 구독합니다.
복제된 구성에서는 분산 합의를 위해 ClickHouse Keeper에 커밋해야 하므로 INSERTs에 상당한 시간(약 1초)이 걸릴 수 있다는 점에 유의하십시오. 또한 스토리지로 S3를 사용하면 지연 시간이 추가로 늘어납니다.
성능 고려 사항
INSERT는 입력 데이터를 기본 키(primary key)로 정렬하고, 파티션 키(partition key)를 기준으로 파티션으로 나눕니다. 여러 파티션에 데이터를 한 번에 삽입하면 INSERT 쿼리 성능이 크게 저하될 수 있습니다. 이를 방지하려면 다음을 수행하세요:
- 한 번에 100,000행 정도의 비교적 큰 배치로 데이터를 추가합니다.
- ClickHouse에 업로드하기 전에 파티션 키를 기준으로 데이터를 그룹화합니다.
- 데이터가 실시간으로 추가되는 경우
- 일반적으로 시간순으로 정렬된 데이터를 업로드하는 경우
비동기 삽입
async_insert 설정을 활성화하십시오.
async_insert 또는 Buffer 테이블 엔진을 사용하면 추가 버퍼링이 발생합니다.
대용량 또는 장시간 실행되는 삽입
max_insert_block_size개의 행을 기록한 후 쿼리할 수 있습니다.
관련 항목