26

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

表1→常連客

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

表 2 ->後援者情報

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

管理者は利用者を管理できます。顧客を削除することを選択すると、その顧客はテーブルから削除されます 1 patrons。この時点で、テーブル 2 patron_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。この時点で何がエラーなのかわかりません。私はいくつかの異なるバリエーションを試しました。また、ここで区切り記号を使用する必要がありますか?

正気を取り戻すのを手伝ってくれる人はいますか?

4

3 に答える 3

51

トリガーコードにエラーがあると思います。削除された利用者 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 コードを入力する場合は、区切り記号も使用してください。

于 2012-08-05T17:18:30.820 に答える
17

patron_info外部キー.pidに ON CASCADE DELETE を設定しないのはなぜですか?

于 2016-07-19T05:40:59.130 に答える
0
create trigger doct_trigger
after delete on doctor
for each row
delete from patient where patient.PrimaryDoctor_SSN=doctor.SSN ;
于 2015-11-19T14:38:35.187 に答える