Как мне создать триггер INSERT, который на основе условия либо обновляет, либо вставляет в другую таблицу? - PullRequest
0 голосов
/ 14 апреля 2020

Я пытаюсь создать триггер в phpmyadmin, и у меня есть 2 таблицы: Предметы и Инвентарь. Это для базы данных библиотеки. Когда я вставляю новый предмет, если предметы уже есть в инвентаре, я хочу добавить к итоговым копиям этого предмета в инвентаре. Если нет, я хочу, чтобы он вставил в инвентарь новую строку с новыми предметами 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

Столбцы инвентаря: инвентаризация (PrimaryKey) (автоинкремент), isbn, totalCopies, totalAvailable, totalCheckedOut.

1 Ответ

0 голосов
/ 14 апреля 2020

Я предполагаю для этого триггера, что идентификатор инвентаря является значением 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 ;

, как вы видите в комментарии Шэдоу указал, что также возможно уменьшить внутреннюю часть. Когда у вас есть столбец 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 ;
...