web-dev-qa-db-fra.com

Déclencheur MySQL après insertion

Je suis nouveau sur MySQL. J'ai deux tables total_loaner et available_loaner. J'essaie de créer un déclencheur pour chaque nouvelle ligne ajoutée dans total_loaner. J'aimerais ajouter cette nouvelle ligne à available_loaner. 

Voici à quoi ressemblent mes tables:

CREATE TABLE `total_loaner` (
  `Kind` varchar(10) NOT NULL,
  `Type` varchar(10) NOT NULL,
  `Sno` varchar(10) NOT NULL,
  PRIMARY KEY (`Sno`)
)

CREATE TABLE `available_loaner` (
  `Kind` varchar(10) NOT NULL,
  `Type` varchar(10) NOT NULL,
  `Sno` varchar(10) NOT NULL,
  `Status` char(10) NOT NULL DEFAULT '',
  PRIMARY KEY (`Sno`)
) 

Ma gâchette ne semble pas fonctionner.

CREATE TRIGGER new_loaner_added 
AFTER INSERT ON 'total_loaner' for each row
begin
INSERT INTO available_loaner (Kind, Type, Sno, Status)
Values (new.Kind, new.Type, new.Sno, 'Available');
END;
14
Mishal Dholakia

Dans votre cas, vous pouvez réécrire votre déclencheur comme ceci

CREATE TRIGGER new_loaner_added 
AFTER INSERT ON total_loaner
FOR EACH ROW 
  INSERT INTO available_loaner (Kind, Type, Sno, Status)
  VALUES (NEW.Kind, NEW.Type, NEW.Sno, 'Available');

Remarque:

  • guillemets simples supprimés du nom de la table total_loaner, car les guillemets en font un littéral de chaîne au lieu d'un identifiant approprié. Vous pouvez utiliser des ticks arrière si vous le souhaitez, mais cela est inutile car ce n'est pas un mot réservé et il ne contient aucun caractère spécial. 
  • puisqu'il s'agit d'un déclencheur à une instruction, vous n'avez plus besoin d'utiliser la commande DELIMITER ni le bloc BEGIN...END.

Voici SQLFiddle démo

14
peterm

Vous devez probablement définir votre délimiteur:

DELIMITER $$

CREATE TRIGGER new_loaner_added 
AFTER INSERT ON `total_loaner` for each row
begin
INSERT INTO available_loaner (Kind, Type, Sno, Status)
Values (new.Kind, new.Type, new.Sno, 'Available');
END$$

DELIMITER ;

À l'heure actuelle, le point-virgule à la fin de l'instruction INSERT est confondu avec celui de l'instruction CREATE TRIGGER.

5
Mike Christensen

Celui-ci a fonctionné pour moi, version plus simplifiée ..

CREATE TRIGGER new_loaner_added 
    AFTER INSERT ON `DB1`.`table_name`
    FOR EACH ROW 
      INSERT INTO `DB2`.`table_name` (messageID, conversationID, fromJID)
      VALUES (NEW.messageID,NEW.conversationID, NEW.fromJID);
4
Jaimin
AFTER INSERT ON `total_loaner`

Utilisez des backticks.

0
Mihai