首页 > 解决方案 > MySQL 错误:无法更新表 SQL 触发器

问题描述

我试图在插入表后实现触发器,以便更新另一个表上的值。基本上,每次添加约会时我都需要更新时间。

问题是当我尝试在 appuntamento(约会表)上插入时出现错误。这是我得到的错误

Error Code: 1442. Can't update table 'prenotazione' in stored function/trigger because it is already used by statement which invoked this stored function/trigger.  0.000 sec

预约表:

CREATE TABLE `appuntamento` (
  `idAppuntamento` int NOT NULL AUTO_INCREMENT,
  `Prenotazione` int NOT NULL,
  `Servizio` int NOT NULL,
  `Impiegato` int NOT NULL,
  PRIMARY KEY (`idAppuntamento`),
  KEY `Servizio_idx` (`Servizio`),
  KEY `Impiegato_idx` (`Impiegato`),
  KEY `prenotaz_1` (`Prenotazione`),
  CONSTRAINT `impiegato_1` FOREIGN KEY (`Impiegato`) REFERENCES `impiegato` (`idImpiegato`),
  CONSTRAINT `prenotaz_1` FOREIGN KEY (`Prenotazione`) REFERENCES `prenotazione` (`idPrenotazione`),
  CONSTRAINT `servizio_1` FOREIGN KEY (`Servizio`) REFERENCES `servizio` (`idServizio`)
) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8

服务表:

`CREATE TABLE `servizio` (
  `idServizio` int NOT NULL AUTO_INCREMENT,
  `TipoServizio` varchar(45) NOT NULL,
  `Descrizione` varchar(200) DEFAULT NULL,
  `Durata` int NOT NULL,
  `Prezzo` decimal(5,2) DEFAULT NULL,
  PRIMARY KEY (`idServizio`)
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8``

预订表:

CREATE TABLE `prenotazione` (
  `idPrenotazione` int NOT NULL AUTO_INCREMENT,
  `Cliente` int NOT NULL,
  `Data` date NOT NULL,
  `OraInizio` time NOT NULL,
  `OraFine` time NOT NULL DEFAULT '00:00:00',
  `CostoTotale` decimal(3,2) NOT NULL DEFAULT '0.00',
  PRIMARY KEY (`idPrenotazione`),
  KEY `Cliente_idx` (`Cliente`),
  CONSTRAINT `cliente_1` FOREIGN KEY (`Cliente`) REFERENCES `cliente` (`idCliente`)
) ENGINE=InnoDB AUTO_INCREMENT=21 DEFAULT CHARSET=utf8

扳机:

DELIMITER $$
CREATE TRIGGER update_hour 
AFTER INSERT ON appuntamento 
FOR EACH ROW 
BEGIN
    DECLARE durata int;
    SELECT Durata INTO @durata
    FROM servizio
    WHERE NEW.Servizio = idServizio;

    UPDATE prenotazione
    SET OraFine = OraInizio + @durata
    WHERE NEW.Prenotazione = prenotazione.idPrenotazione;
END;
$$
DELIMITER ;

这是 Appuntamento 上的插入(也许这是问题所在):

INSERT INTO Appuntamento( Prenotazione, Servizio, Impiegato) VALUES
((SELECT idPrenotazione from prenotazione WHERE idPrenotazione = '11'), 
(SELECT idServizio from servizio WHERE TipoServizio='Acconciatura Uomo'),
(SELECT idImpiegato from impiegato WHERE idImpiegato='2')); 

标签: mysqlsqldatabasetriggers

解决方案


推荐阅读