【问题标题】:MySQL test before insert and cancel if condition is metMySQL 在插入之前进行测试,如果满足条件则取消
【发布时间】:2016-07-26 08:36:16
【问题描述】:

我想创建一个触发器,在插入之前测试条件,如果满足条件则取消插入。

我在包含 if 语句的手册中遇到了这段代码,但文档中没有指定取消插入的方法。

CREATE TRIGGER upd_check BEFORE UPDATE ON account
    -> FOR EACH ROW
    -> BEGIN
    ->     IF NEW.amount < 0 THEN
    ->         SET NEW.amount = 0;
    ->     ELSEIF NEW.amount > 100 THEN
    ->         SET NEW.amount = 100;
    ->     END IF;
    -> END;

【问题讨论】:

  • 此触发器适用于UPDATE 而不是INSERT
  • 我认为从 MySQL 中阻止 INSERT 的唯一方法是抛出异常,这不是很好。有什么方法可以阻止应用层的INSERT

标签: mysql triggers insert


【解决方案1】:

你必须使用signal

SIGNAL 是“返回”错误的方式。 SIGNAL 提供错误 信息到处理程序,应用程序的外部部分,或 给客户。此外,它还提供了对错误的控制 特征(错误号、SQLSTATE 值、消息)。

这样你就可以拥有

CREATE TRIGGER upd_check BEFORE UPDATE ON account
    -> FOR EACH ROW
    -> BEGIN
    ->     IF NEW.amount < 0 THEN
    ->         SET NEW.amount = 0;
    ->     ELSEIF NEW.amount > 100 THEN
    ->         SET NEW.amount = 100;
           ELSE
               SIGNAL SQLSTATE '01000'
                 SET MESSAGE_TEXT = 'Sorry cannot insert', MYSQL_ERRNO = 1000;
    ->     END IF;
    -> END;

更新:您可能还想查看error messages list 并选择更合适的错误编号。

【讨论】:

  • 不错的解决方案!但实际上,您确实需要不同的错误类型。 SQLSTATE 01xxx 是一个警告,不会取消操作。如有疑问,您可以使用HY000,这是“通用异常”的代码。
  • 错误未触发。我使用stackoverflow.com/a/31613668/717267 实现它
猜你喜欢
  • 1970-01-01
  • 2019-03-01
  • 2023-04-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-03-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多