web-dev-qa-db-fra.com

Déclarer et utiliser des variables dans des déclencheurs

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 FROMALien_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?

3
galaxyAbstractor

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.

2
Mr.Brownstone

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;

Source: http://findoutanswer.com/tag/mysql

0
sunny