J'ai testé quelque chose avec des déclencheurs aujourd'hui, mais je suis coincé avec ça et je n'ai aucune idée de ce qui cause mon problème.
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$$
Le problème que j'ai eu est quand vapenid
est/devrait être défini. Je sais qu'il y a un étranger avec ID "ABC". Je sais qu'il y a un vapen
avec ID 1. Dans Alien_Använder_Vapen
Il y a une ligne avec alienId
abc et vapen
comme 1. J'utilise le SIGNAL
pour déboguer un peu quelle est la valeur de vapenid
est, et MySQL retourne
supprimer de Alien où idalien = "ABC" Code d'erreur: 1231. Variable 'Message_Text' ne peut pas être défini sur la valeur de 'null'
Cela me fait penser que NULL est renvoyé de la requête en vapenid
, mais cela n'a pas de sens, comme SELECT vapen FROM
ALien_använder_vapenWHERE idAlien = 'abc'
Dans une requête normale retourne 1 correctement.
J'essaie de comprendre cela depuis un certain temps, mais je ne peux tout simplement pas voir ce que je fais mal. Est-ce que ma syntaxe ou ma logique incorrecte/bizarre?
Selon mon commentaire ci-dessus, les chances sont que vous avez une clé étrangère qui doit être supprimée sur Cascade. C'est ce qui cause votre recherche échoue.
J'espère que ceci vous aide.
Mettez-le comme ceci:
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;