■ はじめに
Snowflake の Table定義 (具体的には default値を変更) を変更する 必要ができたので、予習をしておく。
Table定義変更に関して調べた結果...
* SnowflakeのALTER TABLEでは、default値を変更は対象外だった、、、 * Table定義変更を OR REPLACE 使ってお茶を濁そうかなっと思ったが、 ダメだった。。。
目次
【0】テーブルの種類 1)仮テーブル - TEMPORARY 2)一時テーブル - TRANSIENT 3)永続テーブル 【1】CREATE TABLE 1)CREATE OR REPLACE TABLE 【2】ALTER TABLE 1)ALTER TABLE ... ALTER COLUMN 2)ALTER TABLE ... DROP COLUMN 3)ALTER TABLE ... RENAME TO 4)使用上の注意 【3】補足1:テーブル定義確認 【4】補足2:外部テーブル
【0】テーブルの種類
https://docs.snowflake.com/ja/user-guide/tables-temp-transient#comparison-of-table-types
| # | Table | Keyword | 持続性 |
|---|---|---|---|
| 1 | 仮テーブル | TEMP / TEMPORARY | セッション終了まで |
| 2 | 一時テーブル | TRANSIENT | 明示的に削除されるまで |
| 3 | 永続テーブル | - (テーブルが TEMPORARY または TRANSIENT として宣言されていない場合、そのテーブルは永続的) | 明示的に削除されるまで |
1)仮テーブル - TEMPORARY
* 非永続的な一時データを保存するための一時テーブル * 作成されたセッション内のみに持続するテーブル => セッションが終了すると、テーブルに保存されたデータは システムから完全に消去される => 処理中の一時テーブルとして使用
https://docs.snowflake.com/ja/user-guide/tables-temp-transient#temporary-tables
補足
* 他ユーザーまたはセッションには表示されない * テーブルを作成したユーザーまたはSnowflakeのいずれによっても回復できない
2)一時テーブル - TRANSIENT
* 明示的に削除するまで持続する (一時テーブルとの違い) * タイムトラベルは最大1日まで * Snowflake Fail-safeが利用できないこと (永続テーブルとの違い) cf. transient (トランジェント) = 一時的な,つかのまの,はかない
https://docs.snowflake.com/ja/user-guide/tables-temp-transient#transient-tables
* なお、Snowflake Fail-safeやSnowflake Time Travelについては、 以下の関連記事を参照のこと
Snowflake ~ Time Travel / Fail-safe ~
https://dk521123.hatenablog.com/entry/2025/08/31/005438
メリット
* Snowflake Fail-safeコストが削減できる (Fail-safeディザスタリカバリに必要なデータの維持に関連するコスト)
デメリット
* Snowflake Time Travelの保持期間が経過すると回復できない => 障害から保護する必要がないデータ or Snowflakeの外部で再構築できるデータには、 一時テーブル のみ を使用することが推奨
3)永続テーブル
* 普通のテーブル cf. 永続 (Permanent)
【1】CREATE TABLE
* CREATE文に関しては、 普通に使う分には通常のSQL文とあまり変わらない => 不安な部分や足りない部分は、以下の公式で補えばいい
https://docs.snowflake.com/ja/sql-reference/sql/create-table.html
* 今回取り上げていないが、他にも 「CREATE TABLE ... AS SELECT」「CREATE TABLE ... USING TEMPLATE」 などがあるみたいだが、必要になったら書き足していく、、、
例
-- 例:if not exists create table sample_table if not exists ( id number default null, name varchar(100) default null, birth_date date default null, remarks varchar(255) ); -- transientテーブル(一時テーブル)の場合 -- create transient table sample_table if not exists (...
1)CREATE OR REPLACE TABLE
* 「create or replace table sample_table (...」のように 「or replace」を指定して、置き換えることができる => ただし、動き的には、DROPしてしまうので、 一時テーブルなどで使用する位に留めておいた方がいい (詳細は、以下「使用上の注意」を参照)
2)使用上の注意
https://docs.snowflake.com/ja/sql-reference/sql/create-table.html#usage-notes
より抜粋 ~~~~~~~ ! 重要 ----- OR REPLACE を使用することは、 既存のテーブルで DROP TABLE を使用してから、 同じ名前で新しいテーブルを作成することと同等です。 ~~~~~~~ => DROPしてしまうので、データが入っていたら消えてしまう
【2】ALTER TABLE
* 既存のテーブルのプロパティ、列、または制約を変更 * ALTER TABLE文は、ちょっことSQL文の違う印象、、、
https://docs.snowflake.com/ja/sql-reference/sql/alter-table.html
1)ALTER TABLE ... ALTER COLUMN
https://docs.snowflake.com/ja/sql-reference/sql/alter-table-column.html
2)ALTER TABLE ... DROP COLUMN
* 項目削除
https://docs.snowflake.com/ja/sql-reference/sql/alter-table
サンプル
https://ninthcode.net/240620-snowflake-drop-column/
-- DROP COLUMN [ IF EXISTS ] col_name [ CASCADE | RESTRICT ] -- 指定した列をテーブルから削除します。 ALTER TABLE your_table_name DROP COLUMN Col1; ALTER TABLE your_table_name DROP COLUMN Col2;
3)ALTER TABLE ... RENAME TO
* テーブルのリネーム
https://docs.snowflake.com/ja/sql-reference/sql/alter-table.html
構文
ALTER TABLE [ IF EXISTS ] <name> RENAME TO <new_table_name> -- RENAME TO <new_table_name> -- 指定されたテーブルの名前を、 -- スキーマ内の他のテーブルで現在使用されていない -- 新しい識別子に変更します。
4)使用上の注意
[1] サポート対象外が結構ある
https://docs.snowflake.com/ja/sql-reference/sql/alter-table-column.html
より、「サポート対象外」のみ抜粋 # やりたかった「default値の変更」ができない、、、 # その他にも #2, #3, #5ができないのは痛いかも、、、
| # | カテゴリ | サポート対象外のアクション | 例 |
|---|---|---|---|
| 1 | デフォルト値 | デフォルトがシーケンスでない限り、列のデフォルトを変更できない | DATE型のデフォルトにCURRENT_DATE()が設定してあったのをsysdate()::dateに変更できない |
| 2 | デフォルト値 | 列のデフォルトを追加できない | 何も設定していないNUMBER型にデフォルト「-1」を追加できない |
| 3 | データ型 | 列の データ型 を同義の型に変更できない | STRING から NUMBER に変更できない |
| 4 | データ型 | テキスト/文字列の列 の長さを短くできない | VARCHAR(50) から VARCHAR(25) に変更できない |
| 5 | データ型 | 数値列 のスケールを変更できない | NUMBER(10,2) から NUMBER(10,4) に変更できない |
【3】補足1:テーブル定義確認
https://dk521123.hatenablog.com/entry/2022/02/24/231532
で紹介した DESC を使えばいい(GUIでも見れるけど)
例
-- DESC TABLE <your-table>; DESC TABLE sample_table;
【4】補足2:外部テーブル
* Snowflake にも外部テーブルはある。
外部テーブルの概要
https://docs.snowflake.com/ja/user-guide/tables-external-intro.html
CREATE EXTERNAL TABLE
https://docs.snowflake.com/ja/sql-reference/sql/create-external-table.html
関連記事
Snowflake ~ 基礎知識編 ~
https://dk521123.hatenablog.com/entry/2021/11/02/130111
Snowflake ~ 入門編 / Hello world ~
https://dk521123.hatenablog.com/entry/2021/11/22/212520
Snowflake ~ 基本編 / View ~
https://dk521123.hatenablog.com/entry/2022/10/10/000000
Snowflake ~ SELECT ... EXCLUDE ~
https://dk521123.hatenablog.com/entry/2024/10/01/195225
Snowflake ~ SHOW / DESCRIBE ~
https://dk521123.hatenablog.com/entry/2022/02/24/231532
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ Time Travel / Fail-safe ~
https://dk521123.hatenablog.com/entry/2025/08/31/005438
Snowflake ~ テーブルの簡易バックアップを考える ~
https://dk521123.hatenablog.com/entry/2022/11/07/224328
権限トラブル時のTips
https://dk521123.hatenablog.com/entry/2022/08/19/131922
エラー「Transient object cannot be cloned to a permanent object」時の対応
https://dk521123.hatenablog.com/entry/2024/09/13/213300
dbt ~ Snowflakeテーブル ~
https://dk521123.hatenablog.com/entry/2024/08/29/153801