如何修复“无法更新存储的函数/触发器中的表testtab

时间:2019-05-14 06:47:04

标签: mysql sql

我已经创建了一张桌子

CREATE TABLE testtab (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `customer_id` bigint(20) DEFAULT NULL,
  `food_id` int(11) DEFAULT NULL,
  `created_date` datetime DEFAULT NULL,
  PRIMARY KEY (`id`)
)

表包含在下面的行

INSERT INTO testtab (`customer_id`, `food_id`, `created_date`)
    VALUES ('433', '9', '2019-05-14 12:00:54'); 

现在条件是特定的customer_id,只能有一行带有food_id的8或9。

现在我尝试添加以下插入语句

INSERT INTO testtab (`customer_id`, `food_id`, `created_date`)
    VALUES ('433', '8', '2019-05-14 12:00:54');  

现在它应该失败或被删除后立即删除(使用tag_id = 8记录)。我使用了以下触发器。但不幸的是我出错了

无法更新存储函数/触发器中的表'testtab',因为调用该存储函数/触发器的语句已使用该表。

DELIMITER $$

USE `ipay`$$

DROP TRIGGER /*!50032 IF EXISTS */ `testtabTrigger`$$

CREATE

    TRIGGER `testtabTrigger` AFTER INSERT ON `testtab` 
    FOR EACH ROW BEGIN

    IF ((SELECT COUNT(*) FROM testtab WHERE food_id =9 AND customer_id = new.customer_id) =1 && new.food_id = 8) THEN
    DELETE FROM testtab WHERE food_id = 8 AND customer_id = new.customer_id;
    END IF;


END;
$$

DELIMITER ;

1 个答案:

答案 0 :(得分:0)

您的想法是您执行以下操作:

CREATE TRIGGER `testtabTrigger` BEORE INSERT ON `testtab` 
FOR EACH ROW
BEGIN
    IF (EXISTS (SELECT COUNT(*)
                FROM testtab tt
                WHERE tt.food_id = 9 AND
                      tt.customer_id = new.customer_id
               ) AND
         new.food_id = 8
        ) THEN
          signal sqlstate '45000' set message_text = 'Attempted insert of 8 when there is a 9';
    END IF;
END;