MW211 EXIT

devlog
SQL/INSERT文に一意制約をつける
2011年09月24日
一意属性(UNIQUE)をつけたいのにつけられない項目があるとする。
例えば、削除区分とかを使って削除レコードを履歴として残している場合の
実質的なキー項目とかの場合だ。
#削除レコードを除いて中では一意になる項目とかのこと

ま、とにかく事情があって一意属性はつけられないが
一意であって欲しい場合、INSERT時に制約をかけるとするなら
一旦SELECTで読み込んで存在を確認した上で
存在していない場合のみINSERTするとかいう処理になると思う。

これを一回のSQL文で実現させることができないものかと考えていたのだが
「相関副問い合わせ」ってやつを使えばできてしまうのだ。
┌──────────────────────────────────────┐
│INSERT INTO 出力表 (出力列)                                                 │
│    SELECT 入力列                                                           │
│        FROM 入力表                                                         │
│        WHERE 条件                                                          │
│          AND NOT EXISTS (SELECT *                                          │
│                              FROM 出力表                                   │
│                              WHERE 出力.出力列 = 入力表.入力列);           │
└──────────────────────────────────────┘

「副問い合わせ」までで挫折して「相関副問い合わせ」なんかとは縁がなかったが
こうやって使ってみると便利なものだ。(ってこの使い方が正しいのかはやや不安)

★この方法には問題があることがわかりました、後日加筆修正します
分類:SQL