我需要创建一个简单的触发器:
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;
答案 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 NULL
列cantidad
,您必须在其中为插入语句提供值,或定义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;