in memory of 複合キー

どうよこのタイミングの外し方。我ながら惚れ惚れしちゃうね。複合キーの追憶。

この仕事始めて最初に関わったシステムで、保守やってました。これが非道いのなんのって、稼動後5年経っても枯れる事を知らずに毎日の様に電話が鳴ると云う、いやー鍛えられた。

もうデータパッチなんてガンガンです。しかも毎日何千万とかお金が動いてるデータ。SQLはそれで覚えた。

で、複合キーを持つテーブルをある条件のものに対してのみ区分を修正しなきゃいけないなんて時に、さて困った。その条件ってのは別のテーブルとJOINしないと取って来れないのだこれが。

例えば、受注番号(文字列)+連番(数値)の複合キーを持つ受注明細に修正をしなくちゃいけなくて、こいつに紐つく他テーブルのあるカラムの値でその修正の要否が判るとする。

SELECT
    受注明細.受注番号,
    受注明細.連番
FROM
    受注明細
    INNER JOIN  他テーブル
    ON 受注明細.他テーブルへのFK = 他テーブル.PK
WHERE
    他テーブル.col2 = 'bbb'

とかあるとしますよ。本当はもっともっと複雑で他テーブルがあと2〜3個あった気がしますが。これで複合キーが特定出来ますけども、これをどうやってUPDATE文とくっつけるのか。

いやーストアド書いてカーソル回すしかないんじゃないかと思って、時間がねぇ〜面倒くせぇ〜と頭を抱えてた所へ俺にSQLのこすい技の数々を教えてくれた方が登場。「こうすりゃいいじゃん」と。

UPDATE 受注明細 SET
    何ちゃら区分 = 'A'
WHERE
    受注明細.受注番号 || TO_CHAR(受注明細.連番) IN
    (
        SELECT
            受注明細.受注番号 || TO_CHAR(受注明細.連番)
        FROM
            受注明細
            INNER JOIN  他テーブル
            ON 受注明細.他テーブルへのFK = 他テーブル.PK
        WHERE
            他テーブル.col2 = 'bbb'
    )

「こうするとインデックス見なくなっちゃうんだけどね、データパッチだからいいでしょ」と言葉を残し颯爽と去っていく師匠。その背中に手を合わせましたねぇ。

最初からそんなデータパッチ当てる必要のないしっかりしたシステム作ればいい話なんですけどね。

ファ尻テーション

そのDB師匠の事なんですが。なんか前にも書いた気がするんだけど検索してもひっかからないので書く。

月320時間当たり前プロジェクトでDB師匠と二人で会計周りやってたんですよ。もうずーっと二人で夜中に『シャアが来る』歌って作ってましたね。訳判んない。

トリビアの泉なんて、ほぼ職場で見てましたから。勿論、深夜時代ですよ。ええ。

そんなこんなで、ある本番稼動直後の「この機能が足りない」攻撃を受けて(こう云うのは大概、手形返却がーとか売掛金の返金がーとかそう云う難儀な奴なんだよなあ)急いでDBから画面まで作り直しをやってた時の事。

師匠の考える項目追加じゃその機能が実現出来んと俺が訴えて、これがこうじゃないですか、だからこれじゃ無理ですよ、ああだこうだと随分とまくしたててまして。寝てないし。

で、じっと黙って俺の話を聞くDB師匠。

そして一瞬の間。

ブッ。

屁ですよ。屁。場内大爆笑ですよ。俺も大爆笑でしたよ。笑った後にすぐに「いやーすんません、頭に血が昇ってました」とか謝りましたよ。

「だって六、恐いんだもん」って、狙って屁をこくかあんたは。スカンクか。イタチかオコジョか。

こう云うのを、屁ひりテーションと云う。