mysql:仅在遵守某些条件时插入

时间:2013-05-26 13:58:48

标签: mysql

我试图找到一种方法来检查,在表中添加新元组之前,如果元组尊重某些条件,并且在不遵守其中一个条件的情况下不允许插入。

我想过像

这样的东西
    DELIMITER //
    CREATE  TRIGGER t BEFORE INSERT ON Table
    FOR EACH ROW 
    CALL CHECK1(…);
    CALL CHECK2(…);
    CALL CHECK3(…);
    //
    DELIMITER;

其中check1,check2,check3是引发异常的过程,如果我传递的NEW。(属性)不考虑插入表和/或其他表中的条件。

  • 这是一个正确的和/或好的方式来做我想做的事情吗?
  • 最好的方法是什么?

2 个答案:

答案 0 :(得分:1)

最好的方法是使用存储过程而不是触发器进行数据验证。如果您只想过滤传入的数据,则触发器策略很有用。如果目标是在数据值不合适时完全取消操作,则不能使用触发器在MySQL中执行此操作。

答案 1 :(得分:0)

我正在回答(发表评论我的答案难以理解)并提供更多细节:

我使用了2个策略来实现我的目标,这里有2个例子

1)如果检查很简单

    DELIMITER $$                                                                                                               
    create trigger RV5_1 before insert on Customer                                     
        for each row begin  
    IF(DATEDIFF(CURDATE(),NEW.birthdate)/365<18)                                                                                                                                                                                     
    THEN                                                           
        SIGNAL sqlstate '45006' set message_text = "too young to be a customer";                       
    END IF;                                                    
    END;                                                               
    $$                                                             
    DELIMITER ; 

2)如果检查不容易,需要游标,变量等

     DELIMITER $$                                                                                                              
     create trigger T2 before insert on Table                            
        for each row begin                                             
     IF (check1(NEW.[_some_attribute/s_]) or
         check2(NEW.[_some_attribute/s_]))                   
     THEN                                                      
          SIGNAL sqlstate '45002' set message_text = "invalid insert";
     END IF;    
     END;                                                    
     $$;                                                     
     DELIMITER ;                                                 

其中check1和check2是存储函数,如果可以,则返回0;如果新元组有问题,则返回1。

也许有同样问题的人会发现这有用。