mysql:仅当满足某些条件时插入

mysql:仅当满足某些条件时插入,mysql,Mysql,我试图找到一种方法,在表中添加新元组之前,检查元组是否符合某些条件,如果其中一个条件不符合,则不允许插入 我想到了类似的事情 DELIMITER // CREATE TRIGGER t BEFORE INSERT ON Table FOR EACH ROW CALL CHECK1(…); CALL CHECK2(…); CALL CHECK3(…); // DELIMITER; 其中,check1、check2、check3是

我试图找到一种方法,在表中添加新元组之前,检查元组是否符合某些条件,如果其中一个条件不符合,则不允许插入

我想到了类似的事情

    DELIMITER //
    CREATE  TRIGGER t BEFORE INSERT ON Table
    FOR EACH ROW 
    CALL CHECK1(…);
    CALL CHECK2(…);
    CALL CHECK3(…);
    //
    DELIMITER;
其中,check1、check2、check3是在我传递的新.(属性)不符合插入表和/或其他表中的条件时引发异常的过程

  • 这是一个正确的和/或好的方式,使我的尝试吗
  • 最好的方法是什么

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

      我的回答是回复(带有一条注释,我的回答将无法理解),并提供更多详细信息:

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

      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 ; 
      
      其中check1和check2是存储的函数,如果正常,则返回0;如果新元组出现问题,则返回1

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

           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 ;