1

クリックハウステーブルに文字列列があります。UInt32 への変更タイプでテーブルを変更してみます。

ALTER TABLE main.abonents
列の変更
device_type UInt32 デフォルト 0

しかし、エラーがあります:

 
サーバーから例外を受け取りました:
コード: 6. DB::Exception: 5.200.55.122:9000 から受信。DB::Exception: 文字列 'mo' を UInt32 として解析できません: 文字列の先頭に構文エラーがあります。注: 例外をスローする代わりにゼロを返す toUInt32OrZero 関数があります。

明らかに、クリックハウスはtoUint32「モバイル」のような文字列で関数を使用し、例外をスローします。toUInt32OrZero関数を使用して型を変換するというアドバイス。

ALTER TABLE で関数を使用するにはどうすればよいtoUInt32OrZeroですか??

4

1 に答える 1

0

そのような方法はありません(私の知る限り)。

2 番目のテーブルでそれを実現できます。作成しましょう:

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 クエリを使用してデータを挿入します。すべてのフィールドを同じ順序でリストしてください。device_type をコンバーター関数 ( toUInt32OrZero)にラップします。

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

次に、すべてが問題ないこと (行数が同じであること、device_type が意図したとおりに変換されていることなど) を確認してから、テーブルの名前を変更します。

RENAME TABLE main.abonents TO main.abonents_old;
RENAME TABLE main.abonents_new TO main.abonents;

(または、DROP代わりに古いテーブルを使用することもできます。ただし、事態が悪化した場合に復元できるように古いデータを保持します)

于 2016-11-20T08:00:15.390 に答える