こんにちはー!yokochanです。
自分が何かに縛られて生きるのは好きじゃないけど、他人には制約を付けたい、、という傲慢な人はいないでしょうか?
まあ私もそうなんですが、Snowflakeちゃんはなかなか思うように制約を付けさせてくれないところがあって最近うまくいってなくて。。
という茶番はさておき、Snowflakeのテーブルに制約条件を付けようとしたら思ったような挙動にならなかったという話です。
制約条件の種類
Snowflakeでは以下の制約条件をサポートしているとドキュメントに記載されています。
Snowflakeは、ANSI SQL標準で次の制約のタイプをサポートしています。
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
- NOT NULL
ここでは制約条件の意味の説明については省略します。
注意するポイント
上記の制約条件をそのまま使って問題ないかと言われるとそうではないようで、注意が必要です。
ドキュメントにはこのようなことが書かれています。
注釈
Snowflakeは、制約の定義と維持をサポートしていますが、常に強制される NOT NULL 制約以外については強制しません。
ん、、制約は強制するものではないだと、、制約とは何なのか。。
サポートされている制約条件と注釈の内容を合わせると次のようにまとめられます。
制約を定義できて、機能するもの
- NOT NULL
制約は定義できるが、機能しないもの
- UNIQUE
- PRIMARY KEY
- FOREIGN KEY
「制約は定義できるが、機能しない」とは、例えばテーブル定義上ではA列にUNIQUE制約が付けられているが、新規の行挿入をするときにA列が重複していても普通にエラーなくそのまま値が入ってしまうという感じです。(厳密に言えば、PRIMARY KEYはNOT NULL制約だけは有効になる)
いや~勘違いしちゃうので思わせぶりな態度取らないでほしい笑
なぜこうなってるのか?
いろいろと記事などを漁っているとどうやら他のデータウェアハウス(BigQueryやRedShiftなど)も同様の仕様になっているようです。
調べてもなかなかはっきりとこういう理由!というのはわからなかったのですが、以下のような要因が大きいみたいです。
- 他のRDBと連携させるときに構造を壊さないようにするため
- 列指向DBで制約条件をチェックするのはコストになるため
まあそう聞くとしょうがないのかな、という気がしなくもない。。
そもそもデータウェアハウスのコンセプトとしても、大量のデータをため込んで必要な分だけ引っ張って使ってねみたいな感じなので制約条件の思想とはあまり合わないっていうのは納得がいきます。
ハイスペックな自由人を束縛しようとしてもうまくいかないってことですね笑
今後は制約条件が使えるようになるかも!?
実はSnowflakeが今後公開予定(2023年6月現在)の機能でユニストアというものがあるようです。
https://www.snowflake.com/ja/data-cloud/workloads/unistore/
この記事の中で紹介されているハイブリッドテーブルを使えば制約条件を機能させることができるようになると思います。
これは今後のSnowflakeに期待ですね!