2017-03-01 8 views
0

MySQLデータベースのトリガに少し問題があります。私は2つのテーブルを持つDBを持っています: "仕事"と "ファイル"。 「タスク」テーブルは、「ファイル」テーブルからの主キーの外部キーであるフィールドを有する。時にはnullになることもあります。MySQLのselect文の結果が削除後のトリガーに常にnull

私が遂行しようとしているのは、最初に「タスク」テーブルの行を削除し、その後にトリガーを使用して「ファイル」テーブルの対応する行を削除することです。

これは私が今使っているトリガーです:

DELIMITER // 
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks 
FOR EACH ROW 
BEGIN 
    DECLARE fileId int; 
    SELECT file INTO fileId FROM tasks WHERE id=old.id; 
    DELETE FROM files WHERE id=fileId; 
END;// 
DELIMITER ; 

「タスク」テーブルのフィールド「ファイル」は、外部キーを含むものです。私が実行している例では、そのフィールドは決してnullではありません。

問題は、select文は常にnullを返すことです。このトリガをトリガするdelete文は正常に実行されますが、 "ファイル"テーブルの行は決して削除されません。私はテストテーブルに "fieldId"変数を挿入しようとしましたが、常にnull値を保存しています。

トリガーに問題はありますか?たぶん私は不可能な何かをしようとしているのだろうか?

すべてのヘルプははるかに高く評価される:)

答えて

1

削除された各行に対してループ処理を行う必要があるため、なぜこれは機能しませんか?それでも解決しない場合は

DELIMITER // 
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks 
FOR EACH ROW 
BEGIN 
    DELETE FROM files WHERE id=old.file; 
END;// 
DELIMITER ; 

、これを試みることができる:

DELIMITER // 
CREATE TRIGGER after_delete_file AFTER DELETE ON tasks 
FOR EACH ROW 
BEGIN 
    DELETE FROM files INNER JOIN tasks ON files.id=tasks.file WHERE tasks.id=old.id; 
END;// 
DELIMITER ; 

が、私はそれが必要でなければならないと思います。

+0

こんにちは! はい、私はもっと多くの答えを読むことを実現しました。私は以前はそれを考えなかったとは思えません。 ありがとう! – gascon95

1

削除はデータが削除され、もちろんあなたはそれを見つけることができないことを意味しました。 BEFORE削除のトリガーを作成してみてください。

削除されたテーブルから選択するのではなく、すべての古い値をより慎重に使用することもできます。

+0

アフターデリートが終了してから、トランザクションが終了していないので、それを見つけることができたと思いました。 "タスク"テーブルの削除前に "ファイル"テーブルの行を削除できない前のトリガーを使用できません。そのテーブルの外部キーです。そして、私はそれを "削除カスケード"に設定するのは意味がないと思う。 私はold.fileにアクセスしてトリガーで削除を行う解決策を見つけたと思います。それは第二文の意味ですか?私はあなたが何を意味しているか完全に理解する必要はありませんでした。 – gascon95

+0

ああ、答えてくれてありがとう、ちなみに: – gascon95

関連する問題