web-dev-qa-db-ja.com

テーブルのリレーションを設定すると、「カスケード」、「ヌルを設定」、「制限」はどうなりますか?

新しいプロジェクトでテーブルリレーションの使用を開始したい。

いくつかのグーグルの後、InnoDBとして2つのテーブルをセットアップしました。

リンクしたいキーは

-> users-> userid(プライマリ)-> sessions-> userid(インデックス)

このプロセスで理解できないのは、「更新時」と「削除時」の異なる設定が何をするかだけです

オプションは次のとおりです。

  • -(何も?)
  • カスケード(???)
  • ヌルを設定(すべてをヌルに設定しますか?)
  • アクションなし(まあ...)
  • 制限(???)

基本的に、セッションマネージャーによって有効期限が検出された場合にのみセッションが削除されるため、ユーザーが完全に削除されたときにセッションのデータを削除する必要があります...

だから、これらのオプションが何をするのかを誰かが私に教えてくれるなら、それは大歓迎です。

47
HTDutchy

CASCADEは、親が変更されたときに変更を伝播します。 (行を削除すると、その行を参照する制約されたテーブルの行も削除されます。)

SET NULLは、親行がなくなると列の値をNULLに設定します。

RESTRICTにより、親行のDELETEの試行が失敗します。

編集:あなたはそれらについて尋ねなかったが、SQL標準は2つの他のアクションを定義している:SET DEFAULTおよびNO ACTION。 MySQLでは、NO ACTIONRESTRICTと同等です。 (一部のDBMSでは、NO ACTIONは遅延チェックですが、MySQLではすべてのチェックが即時に実行されます。)MySQLパーサーはSET DEFAULTが、InnoDBとNDBエンジンの両方がこれらのステートメントを拒否するため、SET DEFAULTは、実際にはON UPDATEまたはON DELETE制約。

また、カスケード外部キーアクションはMySQLでトリガーをアクティブ化しないことに注意してください。

119
Ted Hopp

外部キーを含むテーブルはreferencingまたはchild tableと呼ばれ、候補キーを含むテーブルはreferencedまたはparent tableと呼ばれます。

Set NULL:列の値を[〜#〜] null [〜#〜]に設定します親テーブルの行。

[〜#〜] cascade [〜#〜]:CASCADEは親の変更時に伝播します行を削除すると、その行を参照する制約付きテーブルの行も削除されますなど。

[〜#〜] restrict [〜#〜]:RESTRICTは、指定されたparent rowを削除できない親行の値を参照するchild rowが存在する場合。

NO ACTION:NO ACTIONとRESTRICTはよく似ています。参照されたテーブルでUPDATEまたはDELETEステートメントが実行されると、DBMSはステートメント実行の最後でnoneのreferential関係がviolated。短い子行では、親行deleteまたはupdateであれば問題ありません。

17
Jay Patel