【问题标题】:Can not update table in stored function/trigger because it is already used by statement which invoked this stored function/trigger in MYSQL无法更新存储函数/触发器中的表,因为它已被在 MYSQL 中调用此存储函数/触发器的语句使用
【发布时间】:2015-11-03 18:07:55
【问题描述】:

我想设置一个触发器,这样如果在更新时“SyncStatus”= 1,那么触发器将更新“SyncStatusTimestamp”= Current_Time_Stamp。

但我收到一条错误消息:

错误:

无法更新存储函数/触发器中的表“血压电池” 因为它已被调用此存储的语句使用 函数/触发器

----------- 表详细信息 -------------

CREATE TABLE `bloodpressurebattery` (
    `BloodPressureBatteryID` INT(11) NOT NULL AUTO_INCREMENT,
    `ByDevSessionId` INT(11) NOT NULL,
    `ByPatientId` INT(11) NULL DEFAULT NULL,
    `ByDeviceId` INT(11) NULL DEFAULT NULL,
    `Value` FLOAT NULL DEFAULT NULL,
    `SequenceId` INT(11) NULL DEFAULT NULL,
    `SyncStatus` INT(11) NULL DEFAULT '0',
    `Timestamp` TIMESTAMP(3) NULL DEFAULT NULL,
    `WrittenToAndroidDatabaseTimestamp` TIMESTAMP(3) NULL DEFAULT NULL,
    `WrittenToServerDatabaseTimestamp6` TIMESTAMP NOT NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP,
    `SyncStatusTimestamp` TIMESTAMP(3) NULL DEFAULT '1970-01-01 00:00:01.000',
    PRIMARY KEY (`BloodPressureBatteryID`),
    INDEX `ByDevSessionId` (`ByDevSessionId`),
    CONSTRAINT `bloodpressurebattery_ibfk_1` FOREIGN KEY (`ByDevSessionId`) REFERENCES `devicesession` (`DeviceSessionID`) ON UPDATE CASCADE
)
COLLATE='utf8_general_ci'
ENGINE=InnoDB
AUTO_INCREMENT=524874
;

---- 触发器详细信息 ----------

DELIMITER //

    CREATE TRIGGER SyncStatusTimestamp_bloodpressurebattery_after_update
    AFTER UPDATE
       ON bloodpressurebattery FOR EACH ROW

    BEGIN

    DECLARE _SyncStatusTimestamp INT ; 
    DECLARE _BloodPressureBatteryID INT  ;


     SET _BloodPressureBatteryID = (SELECT bloodpressurebattery.BloodPressureBatteryID As _BloodPressureBatteryID
                    FROM  bloodpressurebattery                     
                    WHERE BloodPressureBatteryID =  new.BloodPressureBatteryID  AND SyncStatus = 1);                                            

      IF _BloodPressureBatteryID > 0 THEN

       UPDATE bloodpressurebattery SET SyncStatusTimestamp = CURRENT_TIMESTAMP  AND bloodpressurebattery.BloodPressureBatteryID = _BloodPressureBatteryID ;

      END IF  ;

     END  

【问题讨论】:

    标签: mysql triggers


    【解决方案1】:

    您收到该错误是因为 MySQL 不支持递归触发器。您已在 bloodpressurebattery 表和 UPDATE 上定义了绑定器,您再次尝试通过以下 DML 语句访问同一个表

    UPDATE bloodpressurebattery SET SyncStatusTimestamp = CURRENT_TIMESTAMP  .....
    

    MySQL Documentation

    存储的函数不能递归使用。

    • 在存储的函数或触发器中,不允许修改 已被(用于读取或写入)的表 调用函数或触发器的语句。

    【讨论】:

      猜你喜欢
      • 2019-05-20
      • 2017-05-23
      • 2019-08-05
      • 2013-02-24
      • 2022-11-17
      • 2015-02-13
      • 1970-01-01
      • 2023-01-19
      • 2021-07-09
      相关资源
      最近更新 更多