用于在更新时移动表数据的触发器

egmofgnx  于 2022-09-18  发布在  Java
关注(0)|答案(2)|浏览(187)
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表中删除数据。我遗漏了什么?

3bygqnnd

3bygqnnd1#

触发器不能将UPDATE或INSERT语句激发到调用触发器操作的表中。您可以做的是在触发器代码中操作UPDATE或INSERT语句(在触发器之前)

6ioyuze2

6ioyuze22#

在我看来,这在逻辑上讲不通。我希望Wishlist表存在于两个状态(至少)中,在这两个状态中,第一次插入表时,Delivered=False,UPDATED When Delivered设置为True。但是,您的代码是一个插入触发器。

触发器对每一行进行操作,因此从wishlist中选择所有行以插入到wishlist Delivered是错误的,您应该插入新的。值(请参阅手册)

但这里的杀手是,您不能操作触发触发器的表,即不允许删除。

如果是我,我会创建一个计划的事件,其中包含触发器中的代码,而不是触发器。

相关问题