Materialized Viewに対する一意制約


ん〜、なんだか久々にはてなに書く気がする。。。
たまたまMView関連で検索してたら、ちょっと気になったというか、
教えてあげたい気分になってしまったので、トラバを送ってみるてすつ。


ま〜、教えてあげたいっつうのも、お前何様なんだって感じですが・・・
さらにいえば、5か月近く前の投稿にってのもかなりアレな感じですが・・・(・ε・)キニシナイ!!

高速リフレッシュをかけるmaterialized viewには、一意キーは使えない!!!
なので、キーをnone nunique key にするか、完全リフレッシュに変更する。
(というか、追加→修正or削除→追加みたいな処理をしたときにうまくいかない
ときがある:高速リフレッシュはログが時系列に反映されるのを保証しないため)


これ、確かに普通に一意制約つけちゃうと、たま〜にこけるんだけど、ちゃんと回避策があります。
無論完全リフレッシュにするなどという、全てを台無しにする方法でなく。


方法は至って簡単で、
一意制約をつける時に、遅延制約つけるだけ。


たとえば・・・


ALTER TABLE HOGE ADD COSNTRAINT PK_HOGE PRIMARY KEY(ID) DEFERRABLE;


こうやってPKを作成するだけでふ。


すると、USER_INDEXESとかでもみると、NONUNIQUEになっちゃいますが、
実際にはちゃんとUNIQUEになっていて、ちゃんと重複キーをINSERTしようもんなら怒られますです。
基本的においらがMV作る時は全部遅延制約で定義しますね。


ま、久々の投稿でリハビリってなわけで、今日はこの辺で(ぉ