mysql> delimiter //
mysql> CREATE TRIGGER trig_sd_check BEFORE INSERT ON Customer
-> FOR EACH ROW
-> BEGIN
-> IF NEW.SD<0 THEN
-> SET NEW.SD=0;
-> END IF;
-> END
-> //
mysql> delimiter ;
您可以创建 BEFORE INSERT和 BEFORE UPDATE触发器,这些触发器要么导致错误,要么在数据的要求未得到满足时将字段设置为默认值。
在 MySQL 5.5之后工作的 BEFORE INSERT示例
DELIMITER $$
CREATE TRIGGER `test_before_insert` BEFORE INSERT ON `Test`
FOR EACH ROW
BEGIN
IF CHAR_LENGTH( NEW.ID ) < 4 THEN
SIGNAL SQLSTATE '12345'
SET MESSAGE_TEXT := 'check constraint on Test.ID failed';
END IF;
END$$
DELIMITER ;
在 MySQL 5.5之前,您必须导致一个错误,例如调用一个未定义的过程。
在这两种情况下,这都会导致隐式事务回滚。
MySQL 不允许过程和触发器中包含 ROLLback 语句本身。
如果你不想回滚事务(INSERT/UPDATE 应该通过即使失败的“检查约束”,你可以覆盖的值使用 SET NEW.ID = NULL,这将设置的 id 字段的默认值,没有真正的意义为 id
编辑:
删除了流浪引文。
关于 :=运营商:
与 =不同,:=运算符从不被解释为比较运算符。这意味着您可以在任何有效的 SQL 语句(不仅仅是在 SET 语句中)中使用 :=为变量赋值。