論理削除の絞り込みはWHERE句でやるな
DRANK

これはなにこんにちは、レバテック開発部のもりたです。論理削除、皆さんは採用していますか? わたしが普段開発するシステムでは論理削除を採用しているものもあるのですが、今回はその論理削除の気を付けるべき点として「子テーブルの論理削除されたレコードの絞り込みをWHERE句でしてはならない」という問題について解説します。慣習的に起こりにくいミスなんですが、案外ダメなことを知らない人もいると思うので、ご紹介です。どうすればいいか?こうじゃなくて...SELECT * FROM parents LEFT JOIN children ON parents.id = children.parents_id WHERE parents.deleted_at IS NULL AND children.deleted_at IS NULL ; こう書いてください。SELECT * FROM parents LEFT JOIN children ON parents.id = children.parents_id AND children.deleted_at IS NULL WHERE parents.deleted_at IS NULL ; つまり、子テーブルの論理削除の絞り込みはJOIN句で書いてください。(慣習的にそうしていた人も多いはず)なにがまずいのか論理削除カラムを採用する場合、私たちは「論理削除カラムが有効な場合、そのレコ…

zenn.dev
Related Topics: