CREATE TABLE wishlist(
year YEAR NOT NULL,
ssn CHAR(14),
delivered BIT,
PRIMARY KEY (year, ssn),
FOREIGN KEY (ssn) REFERENCES child (child_ssn)
) engine=innodb;
CREATE TABLE wishlistDelivered(
year YEAR NOT NULL,
ssn CHAR(14),
delivered BIT,
PRIMARY KEY (year, ssn),
FOREIGN KEY (ssn) REFERENCES child (child_ssn)
) engine=innodb;
DELIMITER //
CREATE TRIGGER triggerdelivered after insert on wishlist
FOR EACH ROW BEGIN
INSERT INTO wishlistDelivered
SELECT * FROM wishlist WHERE delivered = 1;
DELETE FROM wishlist WHERE delivered = 1;
END;
//
DELIMITER ;
我本质上是在试图创建一个触发器,它可以将所有已被送到冷库的愿望清单上的物品移动。如果玩具已交付,则愿望列表中的Delivered列中的值为“1”。但是,我仍然可以在值为“1”的地方插入数据,并且它不会更新wishlistDelivered表,也不会从wishlist表中删除数据。我遗漏了什么?
2条答案
按热度按时间3bygqnnd1#
触发器不能将UPDATE或INSERT语句激发到调用触发器操作的表中。您可以做的是在触发器代码中操作UPDATE或INSERT语句(在触发器之前)
6ioyuze22#
在我看来,这在逻辑上讲不通。我希望Wishlist表存在于两个状态(至少)中,在这两个状态中,第一次插入表时,Delivered=False,UPDATED When Delivered设置为True。但是,您的代码是一个插入触发器。
触发器对每一行进行操作,因此从wishlist中选择所有行以插入到wishlist Delivered是错误的,您应该插入新的。值(请参阅手册)
但这里的杀手是,您不能操作触发触发器的表,即不允许删除。
如果是我,我会创建一个计划的事件,其中包含触发器中的代码,而不是触发器。