Как исправить "Не удается обновить таблицу тестовых таблиц в сохраненной функции / триггере - PullRequest
0 голосов
/ 14 мая 2019

Я создал таблицу

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 голосов
/ 14 мая 2019

Идея в том, что вы делаете что-то вроде этого:

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;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...