web-dev-qa-db-ja.com

削除時のMySQL外部キー

私は関係と削除オプションを理解しようとしています。

UserUserStaffの2つのテーブルがあり、UserからUserStaffまで1:nの関係にあります(ユーザーは複数のスタッフメンバーを持つことができます)。

Userが削除されたら、そのUserStaffに関連付けられているすべてのUserテーブルを削除したいと思います。 UserStaffが削除されたとき、Userに何も起こらないようにします。これがカスケード関係であることは理解していますが、どちらの方向かはわかりません。

つまり、UserStaffテーブルで既存の外部キーを選択してカスケードするのですか、それともUserで新しい外部キーを作成してそれをカスケードに設定するのですか?

22
Baub

はい、可能です。 UserStaffテーブルでFKを作成する必要があります。この方法では:

ユーザーテーブル

CREATE TABLE `User` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `Name` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;

UserStaffテーブル

CREATE TABLE `UserStaff` (
  `Id` int(11) NOT NULL AUTO_INCREMENT,
  `UserId` int(11) NOT NULL DEFAULT '0',
  PRIMARY KEY (`Id`),
  KEY `UserId` (`UserId`),
  CONSTRAINT `UserStaff_ibfk_1` 
    FOREIGN KEY (`UserId`) 
    REFERENCES `User` (`Id`) 
    ON DELETE CASCADE ON UPDATE CASCADE
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
23

から ウィキペディア

[〜#〜]カスケード[〜#〜]

マスター(参照)テーブルの行が削除(または更新)されるたびに、外部キー列が一致する子(参照)テーブルのそれぞれの行も削除(または更新)されます。これはカスケード削除と呼ばれます(またはupdate [2])。

ここで、Userはマスターテーブルであり、UserStaffは子テーブルです。したがって、はい、UserStaffON DELETE CASCADEを使用して外部キーを作成する必要があります。

9
Hannele

私がこれを使用してからしばらく経ちましたが、ここに行きます(ところで、私はMySqlにToadを使用しています-素晴らしいIDEであり、それも無料です http://www.toadworld.com/Freeware/ToadforMySQLFreeware/ tabid/561/Default.aspx !)

Userテーブルに制約を追加する必要があります。 id列(およびUserStaffの対応する外部ユーザーIDキー)がある場合、SouceColumnはid、宛先テーブルUserStaff、および宛先列useridである必要があります。次に、OnDeleteアクションを「カスケード」に設定できます。

他のオプションはかなり自明です-制限値をソース列の値に制限し、Set Nullは外部キーの一致をNullに設定し、NoActionは何もしません。

これは、ToadIDEを介して非常に簡単に実行できます。私は何年もの間MySqlAdminツールを使用していましたが、最近Toadを発見しました(そして、diffおよびcompareツールもあります!)。

3
dash

ON DELETE CASCADEは、UserStaffテーブルの外部キーで指定されます。外部キーに関する追加情報については、 MySQLドキュメント にいくつかの例があります。 UserテーブルにはUserStaffを指す外部キーがないため、UserStaffテーブルへの変更による影響を受けません。

3
raistlin0788

最も簡単な方法は、2つのクイックテーブルを作成して試してみることです。しかし、あなたがそうしなかったので、私はあなたにそれがあなたが望むように働くという結果になるだろうとあなたに言うことができます。

テーブルUserがありテーブルUserStaffUserStaffのフィールドである場合、外部キーを使用してUserのフィールドを参照します。次に、UserStaffからレコードを削除すると、Userテーブルに影響を与えることなく削除されます。逆にすると、そのレコードに関連するすべてのレコードが削除されます。

短いバージョン:UserStaffのフィールドは、CASCADEを使用してUserのフィールドを参照する必要があります

2
Marcus