cover image
📱

Rails+MySQLで参照整合性の崩壊を引き起こすデータ操作を検証してみた

カテゴリ
Tech
書いた人
Yuta Sano
公開日
2021/09/08
💡
概要
「スッキリわかるSQL入門」という書籍を進めていて、参照整合性の崩壊を引き起こすデータ操作が4パターンあるとのことを知り・・・
 
🚀
記事はこちら!
Rails+MySQLで参照整合性の崩壊を引き起こすデータ操作を検証してみた - Qiita
「スッキリわかるSQL入門」という書籍を進めていて、参照整合性の崩壊を引き起こすデータ操作が4パターンあるとのことを知り、外部キー周りの理解がなんとなくだったので実際に手を動かして検証してみようと思いました。 この記事では、参照整合性の崩壊を引き起こすデータ操作を行った際に実際にどのような挙動になり、どのようにすれば防げるのかをRails+MySQLで検証します。 外部キーが指し示す先にきちんと行が存在してリレーションシップが成立していること。 「スッキリわかるSQL入門」という書籍で参照整合性の崩壊を引き起こすデータ操作として次の4つのパターンがあるとのことでした。 この4つのパターンを実際に試していこうと思います。 「ほかの行から参照されている」行を削除してしまう 「ほかの行から参照されている」行の主キーを変更してしまう 「存在しない行を参照する」行を追加してしまう 「存在しない行を参照する」行に更新してしまう 書籍を参考に「家計簿テーブル」と「費目テーブル」が登場します。 例えば、以下の家計簿テーブルのid=2のレコードは、費目テーブルのid=2を参照しますが費目テーブルにはid=2のレコードが存在していないため参照整合性が取れていない状態になっています。 今回は参照整合性の検証のため、インデックスやNOT NULL制約など何も考えずにテーブルを作成していきます。 作成されたスキーマ(DB情報が反映されたもの) 費目テーブルのデータを作成します。 ExpenseItem.create!(name: "食費") ExpenseItem.create!(name: "外食費") ExpenseItem.create!(name: "交際費") ExpenseItem.create!(name: "書籍代") ExpenseItem.create!(name: "水道代") ExpenseItem.create!(name: "電気代") ExpenseItem.create!(name: "ガス代") ExpenseItem.create!(name: "携帯代") ExpenseItem.create!(name: "インターネット料金") ExpenseItem.create!(name: "定期代") ExpenseItem.create!(name: "病院代") ExpenseItem.create!(name: "被服費") ExpenseItem.create!(name: "日用品費") ExpenseItem.create!(name: "住宅費") ExpenseItem.create!(name: "給与") 家計簿テーブルのデータを作成します。 内容は適当に入力していきます。 HouseholdAccountBook.create!(date: Date.today, expense_item_id: