我试图找到一种方法来检查,在表中添加新元组之前,如果元组尊重某些条件,并且在不遵守其中一个条件的情况下不允许插入。
我想过像
这样的东西 DELIMITER //
CREATE TRIGGER t BEFORE INSERT ON Table
FOR EACH ROW
CALL CHECK1(…);
CALL CHECK2(…);
CALL CHECK3(…);
//
DELIMITER;
其中check1,check2,check3是引发异常的过程,如果我传递的NEW。(属性)不考虑插入表和/或其他表中的条件。
答案 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。
也许有同样问题的人会发现这有用。