私は関係と削除オプションを理解しようとしています。
User
とUserStaff
の2つのテーブルがあり、User
からUserStaff
まで1:nの関係にあります(ユーザーは複数のスタッフメンバーを持つことができます)。
User
が削除されたら、そのUserStaff
に関連付けられているすべてのUser
テーブルを削除したいと思います。 UserStaff
が削除されたとき、User
に何も起こらないようにします。これがカスケード関係であることは理解していますが、どちらの方向かはわかりません。
つまり、UserStaff
テーブルで既存の外部キーを選択してカスケードするのですか、それともUser
で新しい外部キーを作成してそれをカスケードに設定するのですか?
はい、可能です。 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;
から ウィキペディア :
[〜#〜]カスケード[〜#〜]
マスター(参照)テーブルの行が削除(または更新)されるたびに、外部キー列が一致する子(参照)テーブルのそれぞれの行も削除(または更新)されます。これはカスケード削除と呼ばれます(またはupdate [2])。
ここで、User
はマスターテーブルであり、UserStaff
は子テーブルです。したがって、はい、UserStaff
にON DELETE CASCADE
を使用して外部キーを作成する必要があります。
私がこれを使用してからしばらく経ちましたが、ここに行きます(ところで、私は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ツールもあります!)。
ON DELETE CASCADEは、UserStaff
テーブルの外部キーで指定されます。外部キーに関する追加情報については、 MySQLドキュメント にいくつかの例があります。 User
テーブルにはUserStaff
を指す外部キーがないため、UserStaff
テーブルへの変更による影響を受けません。
最も簡単な方法は、2つのクイックテーブルを作成して試してみることです。しかし、あなたがそうしなかったので、私はあなたにそれがあなたが望むように働くという結果になるだろうとあなたに言うことができます。
テーブルUser
がありテーブルUserStaff
がUserStaff
のフィールドである場合、外部キーを使用してUser
のフィールドを参照します。次に、UserStaff
からレコードを削除すると、User
テーブルに影響を与えることなく削除されます。逆にすると、そのレコードに関連するすべてのレコードが削除されます。
短いバージョン:UserStaff
のフィールドは、CASCADEを使用してUser
のフィールドを参照する必要があります