MySQL创建简单的触发器问题(MySQL中的noob)

时间:2014-02-07 13:11:24

标签: mysql triggers

我需要创建一个简单的触发器:

DELIMITER //
CREATE TRIGGER `create_stock_articulo` AFTER INSERT ON `almacen_tb_articulos`
 FOR EACH ROW
    BEGIN
        DECLARE cur CURSOR FOR SELECT id FROM 'almacen_tb_almacenes';
        DECLARE id INT;
        OPEN cur;
        REPEAT
        FETCH cur INTO id;
             INSERT INTO 'almacen_tb_stock' VALUES (id,NEW.id);
        UNTIL done END REPEAT;
        CLOSE cur;
    END;//

当在'almacen_tb_articulos'中插入行时,此触发器应该在表'almacen_tb_stock'上添加行。每个添加的行必须包含'almacen_tb_almacenes.id'和新的'almacen_tb_articulos.id'。

当我尝试创建此触发器时,我收到此错误:

#1064 - 您的SQL语法出错;检查与MySQL服务器版本对应的手册,以便在''almacen_tb_almacenes'附近使用正确的语法; DECLARE id INT; OPEN cur; REPEAT FETCH cur I'在第4行

我看不出错误在哪里。

表格定义如下:

almacen_tb_articulos:

CREATE TABLE IF NOT EXISTS `almacen_tb_articulos` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `codigo` varchar(15) NOT NULL,
  `descripcion` varchar(150) NOT NULL,
  ... more irrelevant fields,
  PRIMARY KEY (`id`),
  KEY `id_familia` (`id_familia`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=43 

almacen_tb_almacenes:

CREATE TABLE IF NOT EXISTS `almacen_tb_almacenes` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `almacen` varchar(100) NOT NULL,
  `email` varchar(100) NOT NULL,
  `bloqueado` tinyint(1) NOT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=7 ;

almacen_tb_stock:

CREATE TABLE IF NOT EXISTS `almacen_tb_stock` (
  `id_almacen` int(11) NOT NULL,
  `id_articulo` int(11) NOT NULL,
  `cantidad` int(11) NOT NULL,
  PRIMARY KEY (`id_almacen`,`id_articulo`),
  KEY `id_almacen` (`id_almacen`),
  KEY `id_articulo` (`id_articulo`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

2 个答案:

答案 0 :(得分:1)

如果您没有使用游标的特定原因,可以使用INSERT INTO ... SELECT FROM语法,这将大大简化您的代码

CREATE TRIGGER create_stock_articulo
AFTER INSERT ON almacen_tb_articulos
FOR EACH ROW
  INSERT INTO almacen_tb_stock (id_almacen, id_articulo) -- you have to add candidad here
  SELECT id, NEW.id -- and a value for candidas too
    FROM almacen_tb_almacenes;

注意:在您的almacen_tb_stock表中,您有第三个NOT NULLcantidad,您必须在其中为插入语句提供值,或定义DEFAULT您架构中的值。

答案 1 :(得分:0)

我发现您的代码有几个问题:

1)表名用单引号“almacen_tb_almacenes”括起来,这意味着它应该被解释为字符串文字。而是将其括起来:almacen_tb_almacenes。或者不要打扰,因为它可以没有引号。

2)您的代码缺少与光标相关的几个声明:

declare done int default false;
declare continue handler for not found set done = true;

3)你的循环结构不太对劲。试试这个:

open cur;
read_loop: loop
    fetch cur into id;
    if done then
        leave read_loop;
    end if;
    insert into almacen_tb_stock VALUES (id,NEW.id);
end loop;
close cur;