2015-05-29 91 views
0

我試圖做一個觸發INSERT INTOcheckedOutBy的更新後表後裝備表。MySQL的觸發更新,如果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

謝謝sooo。我完全將它關於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