2014-02-07 2 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 구문에 오류가 있습니다; 올바른 구문이 ''almacen_tb_almacenes ''근처에서 사용하도록 MySQL 서버 버전에 해당하는 설명서를 확인하십시오. 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

당신이 크게 코드

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; 

주를 단순화 그냥 INSERT INTO ... SELECT FROM 구문을 사용할 수 있습니다 커서를 사용하기위한 특별한 이유가없는 경우 : 당신의 almacen_tb_stock 표에서를 세 번째 NOT NULLcantidad에 대해 insert 문에 값을 제공하거나 스키마에값을 정의해야합니다.

+0

그래,이 값을 기본적으로 0으로 설정해 줘서 고마워! – mbecares