2012-03-20 142 views
3

我想知道这个触发器有什么问题。我是新的MySQL触发器和存储过程,所以我猜可能有语法错误。mysql触发器中的语法错误

-- Trigger DDL Statements 
DELIMITER $$ 

USE `SNPB`$$ 

DROP TRIGGER IF EXISTS getMsnps$$ 
CREATE TRIGGER getMsnps AFTER INSERT ON m_snps 
FOR EACH ROW 
BEGIN 

    DECLARE glid int(10); 
    DECLARE lost int(1); 
    DECLARE st int(10); 
    DECLARE vto varchar(20); 

    IF(EXISTS(SELECT glyc_id FROM glyc WHERE glyc_start<=NEW.uni_pos AND glyc_end>=NEW.uni_pos AND glyc.uni_prot_ac=NEW.uni_prot_ac)) THEN 
    SELECT glyc_id,glyc_start INTO glid,st FROM glyc WHERE glyc_start<=NEW.uni_pos AND glyc_end>=NEW.uni_pos AND glyc.uni_prot_ac=NEW.uni_prot_ac;  
    SELECT all_snps.var_to INTO vto FROM all_snps,snp_map WHERE snp_map.snpb_id=NEW.snpb_id AND snp_map.ref>0 AND snp_map.all_snps_id=all_snp.all_snps_id; 
    set lost=0;  
    IF NEW.uni_pos=st AND vto!='n' AND vto!='N' THEN 
     set lost=1; 
    END IF; 
    IF NEW.uni_pos=st+1 AND (vto='p' OR vto='P') THEN 
     set lost=1; 
    END IF; 
    IF NEW.uni_pos=st+2 AND vto!='s' AND vto!='S' AND vto!='t' AND vto!='T' THEN 
     set lost=1; 
    END IF; 
    INSERT INTO glyc_map (glyc_id,snpb_id,loss) VALUES (glid,NEW.snpb_id,lost); 

END IF; 
END; 
$$ 
DELIMITER ; 

所以,当我在表中插入行“m_snps”(多行是通过一个单独的语句插入)我应该得到一些行中的“glyc_map”表但从未发生过。我希望有人能告诉我语法是对还是错。

+1

你得到一个错误1064,但有什么错误信息? – 2012-03-20 03:05:34

+2

@ ta.speot.is“DELIMITER”语句仅针对MySQL命令行客户端,而不是整个RDBMS实现的必要特性。 – 2012-03-20 03:18:30

+0

我没有收到任何错误!这真是让我难过。一切似乎都很好。 – user1279904 2012-03-20 03:20:29

回答

0

所有的代码位于一个IF内:

IF(EXISTS(SELECT glyc_id FROM glyc ... 
    -- rest of code, including the insert statement 
END IF; 

如果条件是假的,你会得到什么发生。