2

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

我想到了类似的东西

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

如果我通过的 NEW.(attributes) 不遵守插入表和/或其他表中的条件,则 check1、check2、check3 是引发异常的过程。

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

2 回答 2

1

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

于 2013-05-26T14:10:58.063 回答
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。

也许有同样问题的人会发现这很有帮助。

于 2013-05-28T08:47:25.350 回答