2015-05-29 3 views
0

Я пытаюсь сделать триггер вставку в таблицу после обновления на checkedOutBy в оснащать стол.MySQL триггер AFTER UPDATE IF ELSE вставки

Это дало мне Error 1064 в строках 7, 10 и других, поскольку я случайно изменил вещи, надеясь, что каким-то образом это может просто волшебным образом работать.

DELIMITER $$ 

CREATE TRIGGER moveToHistory AFTER UPDATE ON equip 
FOR EACH ROW 
BEGIN 

IF NEW.checkedOutBy <> Old.checkedOutBy 
BEGIN 

IF OLD.checkedOutBy IS NOT NULL AND NEW.checkedOutBy IS NULL THEN 
    INSERT INTO equipmentHistory(assetId, operation, createdBy, creationDate) 
    VALUES(new.assetId, 'CheckIn', eid, Date(sysdate())) 
    NEW.status = 'CheckedIn'; 
ELSE IF OLD.checkedOutBy IS NULL AND NEW.checkedOutBy IS NOT NULL THEN 
    INSERT INTO equipmentHistory(assetId, operation, createdBy, creationDate) 
    VALUES(new.assetId, 'Checkout', eid, Date(sysdate())) 
    NEW.status = 'CheckedOut'; 
END IF 
END 
END$$ 

DELIMITER ; 
+0

Случайно меняя вещи и надеясь на магию, почти никогда не бывает хорошей идеей. Сказав это, помогите нам помочь вам - можете ли вы разместить DDL своего стола? – Mureinik

ответ

2

Вот триггер с правильным синтаксисом для if - elseif

DELIMITER $$ 
CREATE TRIGGER moveToHistory AFTER UPDATE ON equip 
FOR EACH ROW 
BEGIN 
IF NEW.checkedOutBy <> Old.checkedOutBy then 
    IF OLD.checkedOutBy IS NOT NULL AND NEW.checkedOutBy IS NULL THEN 
     INSERT INTO equipmentHistory(assetId, operation, createdBy, creationDate) 
     VALUES(new.assetId, 'CheckIn', eid, curdate()); 
    ELSEIF OLD.checkedOutBy IS NULL AND NEW.checkedOutBy IS NOT NULL THEN 
     INSERT INTO equipmentHistory(assetId, operation, createdBy, creationDate) 
     VALUES(new.assetId, 'Checkout', eid, curdate()); 
    END IF; 
END IF ; 
END;$$ 

DELIMITER ; 

Также обратите внимание, что я удалил NEW.status = 'CheckedIn'; и NEW.status = 'CheckedOut';, это не имеет смысла, когда вы пытаетесь установить с помощью after update триггера

+0

Большое спасибо. Я полностью отделил его от curdate(). Фантастика. Есть ли что-то вроде визуальной студии, и я могу помочь убедиться, что я не совершаю глупых ошибок? Еще раз спасибо. – JohnL

+0

Ну, к сожалению, нет такого инструмента, о котором я знаю. Хороший способ - попробовать mysql cli, и пусть ошибка случится, и оттуда только вы должны учиться. –

0

Попробуйте это

DELIMITER // 

CREATE TRIGGER moveToHistory AFTER UPDATE ON equip 
FOR EACH ROW 
BEGIN 

IF NEW.checkedOutBy != Old.checkedOutBy 
BEGIN 

IF OLD.checkedOutBy IS NOT NULL AND NEW.checkedOutBy IS NULL THEN 
    INSERT INTO equipmentHistory(assetId, operation, createdBy,creationDate) 
    VALUES(new.assetId, 'CheckIn', eid, Date(sysdate())) 
NEW.status = 'CheckedIn'; 
ELSE IF OLD.checkedOutBy IS NULL AND NEW.checkedOutBy IS NOT NULL THEN 
INSERT INTO equipmentHistory(assetId, operation, createdBy, creationDate) 
VALUES(new.assetId, 'Checkout', eid, Date(sysdate())) 
NEW.status = 'CheckedOut'; 
END IF 
END 
END 
// 
DELIMITER ; 
+0

Как может работать простой! = Вместо <>? Лучше, если вы полностью взглянете на весь триггер вместо случайного отказа от ответа, просто сказав. – Nighthunter22

Смежные вопросы