web-dev-qa-db-ja.com

MySQLトリガー:削除後のテーブルからの削除

スコープ:2つのテーブル。新しい常連客が作成されると、2番目のテーブルにそれらに関するいくつかの情報が保存されます(これもトリガーを使用して行われ、期待どおりに機能します)。これが私のテーブル構造と関係の例です。

表1-> 顧客

+-----+---------+-----+
+  id +   name  + val +
+=====+=========+=====+
+  37 +  george +  x  +
+-----+---------+-----+
+  38 +  sally  +  y  +
+-----+---------+-----+

表2-> patron_info

+----+-----+----------+
+ id + pid +   name   +
+----+-----+----------+
+  1 +  37 +  george  +
+----+-----+----------+
+  2 +  38 +  sally   +
+----+-----+----------+

管理者は顧客を管理できます。彼らが後援者を削除することを選択すると、後援者は表1patronsから削除されます。この時点では、何も起こりません表2patron_info

テーブル1にアイテムが削除されているときに、テーブル2から削除するトリガーを作成しようとしています。ここに私が試したものがあります...

最初に、トリガーが存在する場合、それをドロップしようとします(空気を取り除くだけです)...

DROP TRIGGER IF EXISTS log_patron_delete;

その後、トリガーを作成しようとします...

CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
    WHERE patron_info.pid = patrons.id
END

この時点で、構文エラー1046: Check syntax near END on line 6。この時点でエラーが何であるかわかりません。私はいくつかの異なるバリエーションを試しました。また、ここで区切り文字を使用する必要がありますか?

誰かが私の正気を取り戻すのを手伝ってくれる?

19
Ohgodwhy

トリガーコードにエラーがあると思います。削除された顧客IDを持つすべての行を削除するには、old.idを使用する必要があります(そうしないと、他のIDが削除されます)

これを新しいトリガーとして試してください:

CREATE TRIGGER log_patron_delete AFTER DELETE on patrons
FOR EACH ROW
BEGIN
DELETE FROM patron_info
    WHERE patron_info.pid = old.id;
END

「;」を忘れないでください削除クエリ。また、コンソールウィンドウにTRIGGERコードを入力する場合は、区切り文字も使用します。

42
vivek_jonam

外部キーにCASCADE DELETEを設定しない理由patron_info。pid?

12
Andrew G.
create trigger doct_trigger
after delete on doctor
for each row
delete from patient where patient.PrimaryDoctor_SSN=doctor.SSN ;
0
alireza abedini