2014-02-07 68 views
0

我需要創建一個簡單的觸發器:MySQL中創建簡單的觸發問題(在MySQL小白)

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我在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

'SELECT ID FROM「almacen_tb_almacenes''或'SELECT ID FROM almacen_tb_almacenes'? –

回答

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; 
+0

感謝您的回覆,週一我會測試它,但看起來不錯。 – mbecares

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值。

+0

是的,我默認設置這個值爲零,謝謝! – mbecares