MySQL の ON DELETE CASCADE 句は、自動的に 取り除く 親テーブルから行を削除すると、子テーブルから一致するレコードが削除されます。に関連する一種の参照アクションです。 外部キー 。
外部キー関係で FOREIGN KEY を持つ 2 つのテーブルを作成し、両方のテーブルを親と子にしたとします。次に、カスケード操作を成功させるために、一方の FOREIGN KEY に対して ON DELETE CASCADE 句を定義します。この句は、もう一方の FOREIGN KEY に対して設定する必要があります。 ON DELETE CASCADE が 1 つの FOREIGN KEY 句に対してのみ定義されている場合、カスケード操作ではエラーがスローされます。
MySQL ON DELETE CASCADE の例
MySQL テーブルで ON DELETE CASCADE 句を使用する方法を理解しましょう。まず、という名前の 2 つのテーブルを作成します。 従業員と支払い 。両方のテーブルは、削除カスケード操作の外部キーを介して関連付けられています。ここでいう従業員とは、 親テーブル 、お支払いは 子テーブル 。次のスクリプトは、両方のテーブルとそのレコードを作成します。
表: 従業員
次のステートメントはテーブル Employee を作成します。
CREATE TABLE Employee ( emp_id int(10) NOT NULL, name varchar(40) NOT NULL, birthdate date NOT NULL, gender varchar(10) NOT NULL, hire_date date NOT NULL, PRIMARY KEY (emp_id) );
次に、挿入クエリを実行してレコードを入力します。
INSERT INTO Employee (emp_id, name, birthdate, gender, hire_date) VALUES (101, 'Bryan', '1988-08-12', 'M', '2015-08-26'), (102, 'Joseph', '1978-05-12', 'M', '2014-10-21'), (103, 'Mike', '1984-10-13', 'M', '2017-10-28'), (104, 'Daren', '1979-04-11', 'M', '2006-11-01'), (105, 'Marie', '1990-02-11', 'F', '2018-10-12');
SELECT クエリを実行してテーブルへのデータを確認します。これを次に示します。
表: お支払い
以下のステートメントは、Payment テーブルを作成します。
CREATE TABLE Payment ( payment_id int(10) PRIMARY KEY NOT NULL, emp_id int(10) NOT NULL, amount float NOT NULL, payment_date date NOT NULL, FOREIGN KEY (emp_id) REFERENCES Employee (emp_id) ON DELETE CASCADE );
次に、 挿入ステートメント レコードをテーブルに入力します。
INSERT INTO Payment (payment_id, emp_id, amount, payment_date) VALUES (301, 101, 1200, '2015-09-15'), (302, 101, 1200, '2015-09-30'), (303, 101, 1500, '2015-10-15'), (304, 101, 1500, '2015-10-30'), (305, 102, 1800, '2015-09-15'), (306, 102, 1800, '2015-09-30');
SELECT クエリを実行してテーブルへのデータを確認します。これを次に示します。
私たちにさせて 消去 親テーブル Employee からのデータ。これを行うには、次のステートメントを実行します。
mysql> DELETE FROM Employee WHERE emp_id = 102;
上記のステートメントは、次の従業員レコードを削除します。 emp_id = 102 そして 参照する データを子テーブルに格納します。次の出力が得られる SELECT ステートメントを使用してデータを検証できます。
上記の出力では、emp_id = 102 を参照するすべての行が両方のテーブルから自動的に削除されたことがわかります。
ON DELETE CASCADE アクションによって影響を受けるテーブルを見つけるにはどうすればよいですか?
テーブルからレコードを削除する前に、ON DELETE CASCADE 参照アクションによって影響を受けるテーブルを知りたい場合があります。この情報は、次のように information_schema データベースの Referential_constraints からクエリを実行することで見つけることができます。
Linuxファイル
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'database_name' AND referenced_table_name = 'parent_table' AND delete_rule = 'CASCADE'
以下のステートメントは、ON DELETE CASCADE ルールを使用して Employee テーブルに関連付けられたテーブルに関する結果を生成します。 従業員データベース データベース:
USE information_schema; SELECT table_name FROM referential_constraints WHERE constraint_schema = 'employeedb' AND referenced_table_name = 'Employee' AND delete_rule = 'CASCADE';
上記のコマンドを実行すると、以下の出力が得られます。
MySQL の更新カスケード
の ON UPDATE CASCADE 句 MySQL に慣れている アップデート 親テーブルの行を更新すると、子テーブルから一致するレコードが自動的に取得されます。次の例では、これをより明確に説明します。
まず、使用する必要があります 他の机 以下のように、テーブル Payment に ON UPDATE CASCADE 句を追加するステートメント:
ALTER TABLE Payment ADD CONSTRAINT `payment_fk` FOREIGN KEY(emp_id) REFERENCES Employee (emp_id) ON UPDATE CASCADE;
次の出力が得られます。
以下のスクリプトでは、親テーブルの従業員の ID を更新し、この変更が子テーブルにも自動的に反映されます。
mysql> UPDATE Employee SET emp_id = 102 WHERE emp_id = 103;
従業員と支払いテーブルの内容を確認すると、次のことがわかります。 emp_id 列の値は正常に更新されます。