如果 MySQL 中的行更新,我如何制作一个触发器来推动日期

How do I make a trigger that pushes a date forward incase of a row update in MySQL

所以我正在尝试创建一个触发器,如果​​有新的出价,它将把 lastBidDate 提前一天。所以我制作了两个 table 和一个触发器,但是当我向 table 添加内容时,触发器不会更新任何内容。所以我只是想知道触发器有什么问题,因为我没有收到任何类型的错误。

这是我的 tables:


CREATE TABLE Item (
itemNumber INT NOT NULL AUTO_INCREMENT,
name VARCHAR(255) NOT NULL,
startingPrice INT NOT NULL,
lastBidDate DATE,
acceptedBid INT,
PRIMARY KEY (itemNumber)
);

CREATE TABLE Bid (
bidNumber INT NOT NULL AUTO_INCREMENT,
itemNumber INT NOT NULL,
bidderNumber INT NOT NULL,
bidDate DATE,
bid INT,
PRIMARY KEY (bidNumber),
FOREIGN KEY (itemNumber) REFERENCES item(itemNumber),
FOREIGN KEY (bidderNumber) REFERENCES bidder(bidderNumber)
);

INSERT INTO Item (name, startingPrice, lastBidDate, acceptedBid
) VALUES
 ('Item 1', 50, '2019-06-30', null),
 ('Item 2', 500, '2019-06-02', 800),
 ('Item 3', 1000, '2019-05-30', 1100),
 ('Item 4', 800, '2019-05-06', 800),
 ('Item 5', 200, '2019-07-31', null);
 

INSERT INTO Bid (itemNumber, bidderNumber, bidDate, bid) VALUES
 (1, 1, '2019-05-01', 500),
 (1, 2, '2019-05-01', 600),
 (1, 1, '2019-05-01', 700),
 (2, 5, '2019-05-01', 1000),
 (3, 3, '2018-05-02', 300),
 (3, 2, '2018-05-03', 400),
 (1, 3, '2018-05-06', 800),
 (2, 4, '2018-05-22', 1100);

这是我创建的触发器:

DELIMITER //

CREATE TRIGGER moveEndDate AFTER INSERT ON Bid
    FOR EACH ROW
    BEGIN 
    UPDATE Item JOIN Bid ON Item.itemNumber = Bid.itemNumber SET Item.LastBidDate = DATE_ADD(Item.LastBidDate, INTERVAL 1 DAY) WHERE CURDATE() = Item.lastBidDate;

END//

DELIMITER ;

为了尝试一下,我使用这些 INSERT 命令进行了测试。

INSERT INTO Item (name, startingPrice, lastBidDate, acceptedBid
) VALUES
 ('CustomItem', 50, '2021-05-12', null);

INSERT INTO Bid (itemNumber, bidderNumber, bidDate, bid) VALUES
 (6, 1, '2021-05-12', 500);

您的错误在于在 UPDATE 语句的行源中使用了 Bid。您必须在附加 WHERE 条件中使用标量 NEW.itemNumber 值。

CREATE TRIGGER moveEndDate 
AFTER INSERT
ON Bid
FOR EACH ROW
    UPDATE Item 
    SET Item.LastBidDate = Item.LastBidDate + INTERVAL 1 DAY
    WHERE CURRENT_DATE = Item.lastBidDate
      AND Item.itemNumber = NEW.itemNumber ;

https://dbfiddle.uk/?rdbms=mysql_8.0&fiddle=15ead2c8912a93ab2c46de25f817829c

PS。已删除对 bidder table 的引用。

我会做一些测试,但事先我认为你不能使用你在触发器查询中创建的触发器table