【问题标题】:SQL duplicate triggerSQL 重复触发器
【发布时间】:2013-03-14 03:27:30
【问题描述】:

我有一个简单的数据库类项目,我有实现这种逻辑的商店数据库:对于订单表中的每个客户,当客户确认他的订单时,我们的订单类型 = 'CART' 将其类型更改为 'ORDER' 和我们为客户创建了一个新的 CART。 现在我想编写一个触发器,让我可以控制每个客户只有一个 CART。

我写的是这样的

DELIMITER $$
USE `newshop`$$
CREATE
DEFINER=`root`@`localhost`
TRIGGER `newshop`.`cart_check`
BEFORE INSERT ON `newshop`.`order`
FOR EACH ROW
BEGIN
DECLARE msg VARCHAR(255);
DECLARE count_pn INTEGER;
SELECT count(*) INTO count_pn FROM newshop.order
    where newshop.order.type = NEW.type 
    and NEW.user_id = newshop.order.user_id
    and NEW.type = 'CART' 
    or NEW.type = 'cart' 
    LIMIT 1;
if count_pn > 0 THEN
BEGIN
    set msg = 'Oh no';
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
end;
ELSE
BEGIN
    set msg = 'Oh yeah';
    SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;
END;
END IF;
END$$

然后,当我尝试为 id = 1 的用户插入类型为购物车的新订单时,该订单已经有一个购物车 - 此触发器不允许我这样做,如果我尝试为另一个用户添加购物车,没有购物车 - 这个触发器也不允许我这样做。

【问题讨论】:

  • 我在想那里可能有一个问题。也许有,也许我只是错过了。看起来这个触发器总是会抛出一个异常,这将导致 INSERT 语句失败。如果您希望 INSERT 发生,您需要避免抛出异常(即不要执行 SIGNAL SQLSTATE 语句。)

标签: mysql sql triggers mysql-workbench


【解决方案1】:

否则,你还有SIGNAL SQLSTATE=45000,这是未处理的异常,它会导致返回失败。


SIGNAL SQLSTATE '45000' SET MESSAGE_TEXT = msg;

【讨论】:

    猜你喜欢
    • 2015-07-23
    • 2021-07-03
    • 2011-10-29
    • 2021-10-05
    • 2016-08-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-10
    相关资源
    最近更新 更多