2012-08-13 74 views
7
查询结果

您好,我有很多的表像这样mysql的触发回路与许多行

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 ; 

外键数据库,我需要创建一个触发器在“EMPRESAS插入后,以填补“articulos_empresas” '对'所有'的'行'中的所有行都与新'empresas'选择的'aspectosambientals'匹配。

我得到的所有“articulos”与此查询

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 

,但我不知道如何在触发查询创建一个类似“for循环”的循环,每结果

一些这样的:

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 

谢谢!!!

回答

8

据我所知,你可以迭代通过使用光标的SELECT查询的结果。 在这里看到:http://dev.mysql.com/doc/refman/5.0/en/cursors.html

+0

它的工作原理,如果我保存ir作为一个过程,我可以发送NEW.id作为过程的参数,如果需要在其他触发器中使用 – elin3t 2012-08-13 23:53:26

+0

基于@Razvan答案我在这里留下了结果: – elin3t 2012-08-14 00:59:39

28

基于@Razvan答案我离开这里触发代码,所以也许可以帮助别人

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 ; 

再次感谢!

+0

很好的回答,在生产和实践中非常有用。 – 2016-09-27 14:12:39