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

Я получаю синтаксическую ошибку с моим CREATE TRIGGER MySQL, несмотря на следующий аналогичный синтаксис в ответах на эти темы:

211853

5372872

Но я получаю:

1064 - у вас ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MariaDB, чтобы найти правильный синтаксис для использования рядом с '' в строке 11

Я использую XAMPP, и в настоящее время я пытаюсь запустить этот код в PHPMyAdmin, чтобы убедиться, что он работает перед добавлением на запрос PDO в PHP ...

                CREATE TRIGGER before_mediaitems_update
                BEFORE UPDATE 
                ON mediaitems
                FOR EACH ROW 
                BEGIN
                    IF (NEW.ConsumptionStatus != OLD.ConsumptionStatus) 
                    THEN
                        update UpdateLog_ConsumptionStatus
                        set MediaItemID = OLD.MediaItemID,
                        UpdateValue = NEW.ConsumptionStatus,
                        DateUpdated = NOW();
                    END IF;
                END

До создания этого триггера я уже запустил и успешно создал зависимые таблицы, так что часть сценария работает. В онлайновых MySQL средствах проверки синтаксиса им не нравится этот синтаксис, но они выдают такие же полезные сообщения об ошибках, как и # 1064.

Каждый раз, когда запись в таблице mediaitems изменяет свой ConsumeStatus, я хочу записать в таблица UpdateLog_ConsulationStatus: PK элемента мультимедиа в виде FK в UpdateLog_ConsumpStatus> MediaItemID, затем новое значение ConsulationStatus, наконец, дата и время, когда произошло обновление.

1 Ответ

2 голосов
/ 03 апреля 2020

Ваш код выглядит нормально. Ошибка компиляции указывает на конец оператора update, который заканчивается ;.

Я подозреваю, что вам просто нужно установить DELIMITER, отличное от ;:

DELIMITER //  -- set the delimiter

CREATE TRIGGER before_mediaitems_update
BEFORE UPDATE ON mediaitems
FOR EACH ROW 
BEGIN
    IF NEW.ConsumptionStatus != OLD.ConsumptionStatus
    THEN
        update UpdateLog_ConsumptionStatus
        set MediaItemID = OLD.MediaItemID, UpdateValue = NEW.ConsumptionStatus, DateUpdated = NOW();
    END IF;
END
//

DELIMITER ;  -- reset the delimiter

Демонстрация на DB Fiddle

Примечание: предположительно, вы хотите INSERT вместо UPDATE - или, по крайней мере, UPDATE должен иметь предложение WHERE (в противном случае он обновляет все строки в таблице).

...