mysql中的触发器冲突

时间:2016-09-02 13:02:39

标签: mysql sql codeigniter triggers

我们有一个系统需要bilk更新并在数据库中插入流程,所以我们创建了更新表的触发器。

只有在我们的mysql查询中设置了trigger_call字段时,才会运行触发器。它工作正常但有时触发器与触发器调用查询冲突。

我的触发器:

 CREATE TRIGGER `UpdateAvailabilityUpdateMain` BEFORE UPDATE ON `base`
 FOR EACH ROW BEGIN

        DECLARE vSite VARCHAR(40);
        IF (NEW.availability <> OLD.availability && NEW.trigger_cal=1) THEN
            SET new.trigger_cal =0;
            IF (NEW.availability > OLD.availability) THEN
                SET vSite = NEW.availability - OLD.availability;
                UPDATE reservation_table 
                SET availability = CASE WHEN availability + vSite >=0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id = 0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date; 
                UPDATE room_rate_types_base 
                SET availability = CASE WHEN availability + vSite >=0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id = 0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date;
                UPDATE room_rate_types_additional 
                SET availability = CASE WHEN availability + vSite >=0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id = 0 THEN availability + vSite WHEN availability + vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date;
            ELSEIF (NEW.availability < OLD.availability) THEN
                SET vSite = OLD.availability - NEW.availability;
                UPDATE reservation_table 
                SET availability = CASE WHEN availability - vSite >=0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id = 0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date;
                UPDATE room_rate_types_base 
                SET availability = CASE WHEN availability - vSite >=0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id = 0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date;
                UPDATE room_rate_types_additional 
                SET availability = CASE WHEN availability - vSite >=0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id = 0 THEN availability - vSite WHEN availability - vSite < 0 AND individual_channel_id != 0 THEN 0 END
                WHERE owner_id = new.owner_id AND hotel_id = new.hotel_id AND room_id = new.room_id AND separate_date = new.separate_date;
            END IF;
        END IF;

    END

错误:

Can't update table 'base' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.

在更新期间,发生错误。

UPDATE `base` SET `availability` = 1, `trigger_cal` = 1 WHERE `date` =  '09/09/2016'.

我们没有经常收到错误。有时我们正面临这个问题。我们搜索了很多,但无法找到避免此问题的理由

任何人都可以指出我们,我们缺少什么,为什么会出现这种错误以及如何解决它。

感谢。

0 个答案:

没有答案