今日はトリガーを使用して何かをテストしていますが、それで行き詰まっており、何が問題を引き起こしているのかまったくわかりません。
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 FROM
Alien_Använder_VapenWHERE idAlien = 'abc'
は1を正しく返すため、これは意味がありません。
私はかなり長い間これを理解しようと努めてきましたが、私が間違っていることを見ることができません。構文またはロジックが間違っている/奇妙なのですか?
上記の私のコメントによると、カスケードで削除するように設定されている外部キーがある可能性があります。これが、検索の失敗の原因です。
これがお役に立てば幸いです。
次のように記述します。
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;