【Snowflake】Snowflake ~ 基本編 / CREATE・ALTER TABLE ~

■ はじめに

Snowflake の Table定義 (具体的には default値を変更) を変更する
必要ができたので、予習をしておく。

=> 調べた結果、SnowflakeのALTER TABLEでは、
 default値を変更は対象外だった、、、(後述参照)
=> OR REPLACE 使ってお茶を濁そうかなっと思ったが、
 ダメだった。。。そこら辺もメモしておく(これも後述参照)

目次

【1】CREATE TABLE
 1)CREATE OR REPLACE TABLE
【2】ALTER TABLE
 1)ALTER TABLE ... ALTER COLUMN
 2)ALTER TABLE ... RENAME TO
 使用上の注意
【3】補足1:テーブル定義確認
【4】補足2:外部テーブル

【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)
);

1)CREATE OR REPLACE TABLE

* 「create or replace table sample_table (...」のように
 「or replace」を指定して、置き換えることができる
 => ただし、動き的には、DROPしてしまうので、
  一時テーブルなどで使用する位に留めておいた方がいい
  (詳細は、以下「使用上の注意」を参照)

使用上の注意
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 ... 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>
--  指定されたテーブルの名前を、
--  スキーマ内の他のテーブルで現在使用されていない
--  新しい識別子に変更します。

使用上の注意

[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 ~ SHOW / DESCRIBE ~
https://dk521123.hatenablog.com/entry/2022/02/24/231532
Snowflake ~ ストレージ統合 ~
https://dk521123.hatenablog.com/entry/2022/06/29/221037
Snowflake ~ テーブルの簡易バックアップを考える ~
https://dk521123.hatenablog.com/entry/2022/11/07/224328
権限トラブル時のTips
https://dk521123.hatenablog.com/entry/2022/08/19/131922