web-dev-qa-db-ja.com

トリガーでの変数の宣言と使用

今日はトリガーを使用して何かをテストしていますが、それで行き詰まっており、何が問題を引き起こしているのかまったくわかりません。

DELIMITER $$

USE `pucko`$$

CREATE TRIGGER `after_delete_Alien`
AFTER DELETE ON `Alien` FOR EACH ROW BEGIN       
    DECLARE vapenid INT;
    DECLARE alien_count INT;
    DECLARE rymdskepp_count INT;

    SET vapenid = (SELECT vapen FROM `Alien_Använder_Vapen` WHERE idAlien = OLD.idAlien);

    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = vapenid; // Debug, this shows that vapenid is null?

    DELETE FROM `Alien_Använder_Vapen` WHERE idAlien = OLD.idAlien;

    SET alien_count = (SELECT count(*) FROM `Alien_Använder_Vapen` WHERE vapen = vapenid);
    SET rymdskepp_count = (SELECT count(*) FROM `Rymdskepp_Använder_Vapen` WHERE vapen = vapenid);


    if(alien_count < 1 && rymdskepp_count < 1) THEN
        DELETE FROM `vapen` WHERE idVapen = vapenid;
    END IF;
END$$

私が抱えている問題は、vapenidが設定されている/する必要がある場合です。 ID "abc"のエイリアンがいることを知っています。 IDが1のvapenがあることを知っています。Alien_Använder_Vapenには、alienId abcおよびvapenが1の行があります。SIGNALは、vapenidの値を少しデバッグし、mySQLが返す

idAlien = "abc"エラーコード:1231のAlienから削除します。変数 'MESSAGE_TEXT'を 'NULL'の値に設定することはできません

これは、vapenidのクエリからNULLが返されると思いますが、通常のクエリのSELECT vapen FROMAlien_Använder_VapenWHERE idAlien = 'abc'は1を正しく返すため、これは意味がありません。

私はかなり長い間これを理解しようと努めてきましたが、私が間違っていることを見ることができません。構文またはロジックが間違っている/奇妙なのですか?

3

上記の私のコメントによると、カスケードで削除するように設定されている外部キーがある可能性があります。これが、検索の失敗の原因です。

これがお役に立てば幸いです。

2
Mr.Brownstone

次のように記述します。

declare int_value int default 1;
DELIMITER $$
CREATE TRIGGER call_trigger
 AFTER INSERT ON ticket
 FOR EACH ROW
BEGIN
 declare v_index int default 1;
 while v_index <= 15 do
   **YOUR QUERY**
   set v_index := v_index + 1;
 end while;
END
$$
DELIMITER;

ソース: http://findoutanswer.com/tag/mysql

0
sunny