2014-09-10 5 views
0

J'ai une requête SQL je peux courir qui ressemble à:MySQL Trigger Auto-Update (ou insérer) colonne Champ

SELECT 
    SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 1), ' ', -1) AS first_name, 
    If( length(name) - length(replace(name, ' ', ''))>1, 
     SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 2), ' ', -1) ,NULL) 
      as middle_name, 
    SUBSTRING_INDEX(SUBSTRING_INDEX(name, ' ', 3), ' ', -1) AS last_name 
FROM people 

Bien que ce soit fonctionne très bien pour diviser la name complète en first_name, middle_name, et last_name J'ai besoin d'un moyen de faire cela automatiquement; ne peut pas entrer et exécuter la requête et mettre à jour manuellement la table chaque fois qu'un person est ajouté.

J'ai essayé de jouer avec cette requête sous la forme d'un déclencheur, mais continuez à recevoir des erreurs, généralement les états d'erreur "Not allowed to return a result set from trigger"

Toute aide pour ce travail serait génial

+0

double possible de [pas le droit de retourner un ResultSet à partir d'un déclencheur mysql] (http://stackoverflow.com/ questions/12474489/not-allowed-to-return-a-resultset-from-a-trigger-mysql) – imtheman

Répondre

0

Dans un INSERT AVANT trigger, utilisez le qualificateur NEW. pour référencer les valeurs affectées aux colonnes de la ligne en cours d'insertion. Par exemple, NEW.col référencerait la valeur fournie pour la colonne col.

Affectez une valeur (ou une expression) à NEW.col pour remplacer la valeur fournie pour la colonne col, et la valeur attribuée sera insérée à la place.

Un déclencheur pour accomplir quelque chose de similaire à l'instruction SELECT ressemblerait à quelque chose comme ceci:

DELIMITER $$ 

CREATE TRIGGER mytrigger 
BEFORE INSERT ON mytable 
FOR EACH ROW 
BEGIN 

    SET NEW.first_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 1), ' ', -1); 

    SET NEW.last_name = SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 3), ' ', -1); 

    SET NEW.middle_name = IF(LENGTH(NEW.name) - LENGTH(REPLACE(NEW.name, ' ', ''))>1 
     ,SUBSTRING_INDEX(SUBSTRING_INDEX(NEW.name, ' ', 2), ' ', -1) 
     ,NULL); 

END$$ 

DELIMITER ; 

L'erreur que vous obtenez:

Error: 1415 SQLSTATE: 0A000 (ER_SP_NO_RETSET) 
Message: Not allowed to return a result set from a %s 

est due à une restriction documentée applicable à la fois FUNCTION et TRIGGER. (Cette restriction s'applique également à un PROCEDURE qui est appelé du contexte d'une fonction ou TRIGGER.)

+0

Merci, ça marche parfaitement! –

+0

@ jzg.dev: Je n'ai fait aucun test sur ce point, j'ai simplement copié les expressions que vous aviez dans l'instruction SELECT, et donné un exemple de ce à quoi pourrait ressembler un déclencheur BEFORE INSERT. (Vous voudrez vérifier si vous avez besoin d'un déclencheur 'BEFORE UPDATE' correspondant, s'il est important de garder ces colonnes" synchronisées "Dans un trigger' BEFORE UPDATE', la valeur actuelle des colonnes est disponible en se qualifiant avec ** 'OLD.' **, par exemple' IF (NEW.col <=> OLD.col) 'pour comparer la nouvelle valeur avec la valeur existante – spencer7593

+0

Oui, j'ai attrapé ce petit morceau, merci encore! –