2012-08-13 26 views
7

Ciao ho un database con molte tabelle e chiavi esterne come questoMysql trigger loop per il risultato query con molte righe

CREATE TABLE IF NOT EXISTS `articulos` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `nombre` varchar(63) NOT NULL, 
    `contenido` text NOT NULL, 
    `normas_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=138 ; 

CREATE TABLE IF NOT EXISTS `aspectosambientales` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `nombre` varchar(63) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=28 ; 

CREATE TABLE IF NOT EXISTS `aspectosambientales_articulos` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `aspectosambientales_id` int(11) NOT NULL, 
    `articulos_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_aspaspectosambientales1`  (`aspectosambientales_id`), 
    KEY `fk_aspee` (`articulos_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 UTO_INCREMENT=225 ; 

CREATE TABLE IF NOT EXISTS `empresas` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `razonsocial` varchar(127) DEFAULT NULL, 
    `nit` varchar(63) DEFAULT NULL, 
    `direccion` varchar(127) DEFAULT NULL, 
    `telefono` varchar(15) DEFAULT NULL, 
    `web` varchar(63) DEFAULT NULL, 
    `auth_user_id` int(11) NOT NULL, 
    PRIMARY KEY (`id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=2 ; 

CREATE TABLE IF NOT EXISTS `articulos_empresas` (
    `id` int(11) NOT NULL AUTO_INCREMENT, 
    `empresas_id` int(11) NOT NULL, 
    `articulo_id` int(11) NOT NULL, 
    `acciones` text, 
    `responsable` varchar(255) DEFAULT NULL, 
    `plazo` date DEFAULT NULL, 
    `cumplido` tinyint(1) DEFAULT NULL, 
    PRIMARY KEY (`id`), 
    KEY `fk_normas_empresas_empresas1` (`empresas_id`), 
    KEY `fk_normas_empresas_normas1` (`normas_id`) 
) ENGINE=InnoDB DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ; 

e ho bisogno di creare un trigger per riempire le 'articulos_empresas' dopo inserto in 'empresas 'per tutte le righe in' articulos 'che corrispondono a' aspectosambientals 'che le nuove' empresas 'hanno selezionato.

ricevo tutte le esigenze degli articulos 'con questa query

SELECT articulos_id FROM aspectosambientales_articulos 
    WHERE aspectosambientales_id = ID 
     -- ID is the aspectosambientales_id selected when the 'empresas' row is created 
     -- maybe something like NEW.aspectosambientales_id 

ma io non so come creare un ciclo come 'ciclo' in attivazione per ogni risultato della query

alcuni, come questo:

CREATE TRIGGER 'filltableae' AFTER INSERT ON 'empresas' 
FOR EACH ROW 
BEGIN 
DECLARE arrayresult = (SELECT articulos_id FROM aspectosambientales_articulos 
    WHERE aspectosambientales_id = NEW.aspectosambientales_id) 
--- here is when i have to do the loop for all the results 
--- for ids in arrayresults 
--- insert into articulos_empresas ('',NEW.id, ids, '', '' ,'','') 
--- endfor 
END 

grazie !!!

risposta

8

Per quanto ne so, è possibile scorrere il risultato di una query SELECT utilizzando i cursori. vedere qui: http://dev.mysql.com/doc/refman/5.0/en/cursors.html

+0

Funziona e se si salva ir come procedura, è possibile inviare NEW.id come parametro della procedura se è necessario utilizzare negli altri trigger – elin3t

+0

In base alla risposta @Razvan ho lasciato il risultato qui: – elin3t

28

in base alla risposta @Razvan ho lasciato qui il codice per il trigger, quindi forse può aiutare qualcuno

DROP TRIGGER IF EXISTS AEINST; 
DELIMITER // 
CREATE TRIGGER AEINST AFTER INSERT ON procesos_aspectos 
FOR EACH ROW 
BEGIN 
    DECLARE done INT DEFAULT FALSE; 
    DECLARE ids INT; 
    DECLARE cur CURSOR FOR SELECT articulos_id FROM aspectosambientales_articulos WHERE aspectosambientales_id = NEW.aspectosambientales_id; 
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET done = TRUE; 

    OPEN cur; 
     ins_loop: LOOP 
      FETCH cur INTO ids; 
      IF done THEN 
       LEAVE ins_loop; 
      END IF; 
      INSERT INTO articulos_empresas VALUES (null,ids, NEW.empresas_id,null,null,null,null); 
     END LOOP; 
    CLOSE cur; 
END; // 
DELIMITER ; 

grazie ancora!

+0

Risposta ottima , molto utile nella produzione e nelle pratiche. –

Problemi correlati