以下の内容はhttps://dk521123.hatenablog.com/entry/2022/09/03/012113より取得しました。


【Snowflake】Snowflake ~ 基本編 / テーブル ~

■ はじめに

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




以上の内容はhttps://dk521123.hatenablog.com/entry/2022/09/03/012113より取得しました。
このページはhttp://font.textar.tv/のウェブフォントを使用してます

不具合報告/要望等はこちらへお願いします。
モバイルやる夫Viewer Ver0.14