我如何根据条件创建一个INSERT触发器,该触发器将更新或插入到另一个表中?

问题描述 投票:-1回答:1

我正在尝试在phpmyadmin中创建触发器,并且我有2个表,即Item和Inventory。这是针对图书馆数据库的。当我插入一个新项目时,如果项目isbn已存在于库存中,我想将其添加到库存中该项目的totalCopies中。如果不是,我希望它在库存中插入一个新行,其中包含新的项目isbn。这是我第一次使用触发器,并且出现语法错误。这就是我现在所拥有的。

BEGIN
IF ((SELECT COUNT(*) FROM inventory WHERE inventory.isbn = NEW.isbn) > 0) THEN
(
    UPDATE inventory
    SET inventory.totalCopies = inventory.totalCopies + 1 
    WHERE inventory.isbn = NEW.isbn
    SET inventory.totalAvailable = inventory.totalAvailable + 1
    WHERE inventory.isbn = NEW.isbn
    )
ELSE
INSERT INTO inventory VALUES( , NEW.isbn, 1, 1, 0)
END

库存列是:inventoryID(PrimaryKey)(自动增量),isbn,totalCopies,totalAvailable,totalCheckedOut。

mysql database-trigger mysql-error-1064
1个回答
0
投票

我为此触发器假定库存ID是一个auto_increment值,否则插入会出现错误。

UPDATE查询可能有点简化

DELIMITER $$

CREATE TRIGGER insorup
AFTER INSERT
ON ORDERS FOR EACH ROW
BEGIN
    IF (EXISTS(SELECT 1 FROM inventory WHERE inventory.isbn = NEW.isbn) ) THEN
        UPDATE inventory
           SET inventory.totalCopies = inventory.totalCopies + 1 ,
           inventory.totalAvailable = inventory.totalAvailable + 1
        WHERE inventory.isbn = NEW.isbn;
    ELSE
        INSERT INTO inventory VALUES ( NEW.isbn, 1, 1, 0);
    END IF;
END$$

DELIMITER ;

正如您在评论中看到的,Shadow指出,也有可能缩小内部部分。当您将列ISBN声明为UNIQUE

DELIMITER $$

CREATE TRIGGER insorup
AFTER INSERT
ON ORDERS FOR EACH ROW
BEGIN

    INSERT INTO 
       inventory VALUES ( NEW.isbn, 1, 1, 0)
    ON DUPLICATE KEY UPDATE inventory.totalCopies = inventory.totalCopies + 1 ,
               inventory.totalAvailable = inventory.totalAvailable + 1;
END$$

DELIMITER ;
© www.soinside.com 2019 - 2024. All rights reserved.