如果 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
所以我正在尝试创建一个触发器,如果有新的出价,它将把 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