kmishima16 / praha

0 stars 0 forks source link

外部キー制約について #19

Open kmishima16 opened 1 month ago

kmishima16 commented 1 month ago

課題解答ページ作成しました。 内容についてご確認よろしくお願いいたします。 https://different-shock-b76.notion.site/12527f38df768051b4a7c70afe6062f6?pvs=4

tom106gunma commented 3 weeks ago

@kmishima16

課題1-2

その他の問題として、2つ以上のトランザクションが外部キー制約のチェックや更新を行おうとしたときに、互いの処理が終わるのを待つ状態になってしまい、結果としてどちらも完了できなくなってしまうことがあるそうです。 外部キー制約でデッドロックに引っかかった話

課題3-1

1. 外部キー制約として参照されているカラム名を変更したい場合、どういった処理を行えばよいでしょうか?

①外部キー設定を削除 ②カラム名を変更 ③外部キーを設定 一度外部キー制約の設定を削除しないと変更することができない。

2. 外部キー制約が利用されているテーブルは、利用されていないテーブルと比べて、挿入時や削除時のパフォーマンスに違いはあるでしょうか?

参照先の整合性のチェックやトランザクションのロックなど追加の処理が発生するため、パフォーマンスが落ちてしまう。

3. 外部キー制約に違反する場合のエラーメッセージはどういったものでしょうか?MYSQLとPostgreSQLそれぞれ教えてください。

MySQL

[1451] [23000]: Cannot delete or update a parent row: 
a foreign key constraint fails (`test_db`.`Issue`, CONSTRAINT `Issue_ibfk_1` 
FOREIGN KEY (`assignee_id`) REFERENCES `Assignee` (`id`))

PostgreSQl

[23503]: ERROR: update or delete on table "assignee" violates foreign key constraint 
"fk_assignee" on table "issue"
  詳細: Key (id)=(1) is still referenced from table "issue".

MySQLは制約の情報。PostgreSQLは制約の情報 + 値。PostgreSQLの方が親切に感じました。

クイズ2の解答を考える際にこんな記事を見つけました。 PostgreSQLで外部キーを使う際の注意点

PostgreSQLだと手動でインデックスを貼らないといけないようです。 使用するデータベースによって挙動が違うので注意しないといけないと感じました。