ClickPipes for Postgres は、ソーステーブルのスキーマ変更を検出し、場合によってはその変更を宛先テーブルへ自動的に反映できます。各 DDL 操作がどのように処理されるかを以下に示します。
| スキーマ変更の種類 | 動作 |
|---|---|
新しいカラムの追加 (ALTER TABLE ADD COLUMN ...) |
テーブルで insert/update/delete が発生すると、自動的に反映されます。新しいカラムには、スキーマ変更後にレプリケートされたすべての行に対して値が設定されます |
デフォルト値付きの新しいカラムの追加 (ALTER TABLE ADD COLUMN ... DEFAULT ...) |
テーブルで insert/update/delete が発生すると、自動的に反映されます。サポートされているデフォルト値も ClickHouse のカラムに追加されるため、スキーマ変更後にレプリケートされた行だけでなく、すでに ClickHouse にある行にも適用されます。 |
既存カラムの削除 (ALTER TABLE DROP COLUMN ...) |
検出はされますが、反映は されません。削除されたカラムには、スキーマ変更後にレプリケートされたすべての行で NULL が設定されます |
カラムの追加は、バッチ同期の最後に反映される点に注意してください。これは、同期間隔または pull batch size のしきい値に達した後に発生する可能性があります。同期の制御について詳しくは、こちらを参照してください。
追加したカラムのデフォルト値
追加したカラムについて、ClickPipes は値を安全に ClickHouse に変換できる場合にのみデフォルト値を反映します。デフォルト値が反映されると、ClickHouse は新しいカラムが追加される前のデータパーツを読み取る際にその値を使用します。その結果、ClickHouse にすでに存在する行には、PostgreSQL で ADD COLUMN より前から存在する行に使用される値と同じ値が表示されます。テーブル全体の更新は必要ありません。
PostgreSQL では、ClickPipes はカラムの現在のデフォルト式ではなく、既存の行に対して PostgreSQL が保存した値を読み取ります。デフォルト値が式の場合、これは重要です。now() のような非揮発性の式はカラム追加時に PostgreSQL によって評価され、ClickPipes は式そのものではなく、その評価結果を反映します。後から実行する SET DEFAULT や DROP DEFAULT 操作は既存の行に使用されるデフォルト値を変更せず、ClickHouse にも反映されません。
次の値が反映されます。
- ブール値および有限の数値。
varchar、char、enum、UUID、JSON/JSONB、hstore、ネットワークアドレス、Date を含むテキスト値。- タイムスタンプ。タイムゾーン付きのタイムスタンプは UTC に正規化されます。
NULL、非有限の数値、bytea、配列、インターバル、時刻のみの値、ジオメトリ型など、ClickHouse に安全に移植できない表現のデフォルト値は省略されます。カラム自体は追加されますが、ClickHouse はカラム追加前のパーツに対して通常の型のデフォルト値を使用します。既存の行にソース側のデフォルト値を含める必要がある場合は、テーブル全体の更新が必要です。