2013-05-26 58 views
2

我试图找到一种方法来检查,然后在表中添加新的元组之前,如果元组尊重某些条件并且在不尊重其中一个条件的情况下执行不允许插入。mysql:只有在尊重某些条件时才插入

我想到了什么样

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

凡CHECK1,CHECK2,check3是抛出一个异常程序,如果NEW(属性),我通过不插入表尊重状况和/或与其他表格。

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

回答

0

我回答回答(用评论我的回答将是不可理解的),并透露更多的细节:

我用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。

也许某个具有相同问题的人会发现这有帮助。

1

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

相关问题