2016-11-15 1 views
0

클릭 하우스 테이블에 문자열 열이 있습니다. 나는 UINT32에 수정 유형 테이블을 변경하려고 :클릭 하우스에서 toUInt32OrZero 함수를 사용하여 열 유형을 변경하는 방법은 무엇입니까?

 
ALTER TABLE main.abonents 
MODIFY COLUMN 
device_type UInt32 DEFAULT 0 

을하지만,이 오류 : 그것은 분명

 
Received exception from server: 
Code: 6. DB::Exception: Received from 5.200.55.122:9000. DB::Exception: Cannot parse string 'mo' as UInt32: syntax error at begin of string. Note: there are toUInt32OrZero function, which returns zero instead of throwing exception.. 

, '모바일'과 던져 예외와 같은 문자열을 toUint32 기능을 사용 clickhouse. 그리고 그것의 조언은 유형을 변환하기 위해 toUInt32OrZero 함수를 사용하는 것입니다.

toUInt32OrZero 함수를 ALTER TABLE과 어떻게 사용할 수 있습니까 ??

답변

0

(내가 아는 한) 그런 방법은 없습니다.

두 번째 표를 사용하여이를 달성 할 수 있습니다. 다음 중 하나를 만듭니다.

CREATE TABLE main.abonents_new AS main.abonents; 

그러면 새 테이블에서 열을 변경해야합니다. 이 테이블은 아직 데이터가없는, 그래서 예외를 발생하지 않습니다

ALTER TABLE main.abonents_new MODIFY COLUMN device_type UInt32 DEFAULT 0; 

그런 다음, 새로운 데이터가 main.abonents에 기록되지되어 있는지 확인하십시오. 우리는 새로운 테이블로 데이터를 전송할 때 모든 것을 유지하고 싶습니다.

INSERT INTO SELECT 쿼리를 사용하여 데이터를 삽입하십시오. 모든 필드를 같은 순서로 나열하십시오.

RENAME TABLE main.abonents TO main.abonents_old; 
RENAME TABLE main.abonents_new TO main.abonents; 
: 모든 게 괜찮아 (의도 한대로 행이 동일한 계산 것을 DEVICE_TYPE이 등을 개조되었다가), 다음 테이블의 이름을 변경 있는지 확인하십시오, 그리고

INSERT INTO main.abonents_new SELECT field1, field2, ..., toUInt32OrZero(device_type) AS device_type, ..., fieldN FROM main.abonents; 

: 컨버터 기능 (toUInt32OrZero)에 DEVICE_TYPE 포장

(또는 더 오래된 테이블 대신 DROP 일 수 있습니다. 이전 데이터를 유지할 수 있지만 things'd가 남쪽으로 이동하면 복원 할 수 있습니다)