2017-10-15 45 views
2

我試圖創建一個觸發器來更新插入器上另一個表中的行。最後一部分工作,但如果沒有該行的那個ID,我想在添加它之前爲該ID創建一行。SQL觸發器:如果行不存在則創建行

但我得到#1064錯誤: 'FOR EACH ROW resource_xpEvents BEGIN IF NOT EXISTS(SELECT 1 FROM resource_xp'

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW 
BEGIN 
IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId); 
END IF; 

UPDATE resource_xp 
    SET xp = xp + new.delta 
    WHERE userId = new.userId 

END $$ 
DELIMITER ; 

回答

0

試試這個,但表現更糟糕。

+0

當您嘗試安裝觸發器時,您會收到錯誤消息? – farbiondriven

+0

我的不好。另一個錯誤:第12行'END'的語法錯誤 –

+2

因爲缺少a;在更新聲明的末尾。 –

0

您可以嘗試在這裏使用MySQL的INSERT ... ON DUPLICATE KEY UPDATE語法首先,如果userId列尚未獨特,使其獨特:

ALTER TABLE resource_xp ADD CONSTRAINT UNIQUE (userId); 

然後,而不是試圖做一個獨立的條件INSERT和UPDATE語句,只是做了以下單個語句:

INSERT INTO resource_xp (userId) 
VALUES (NEW.userId) 
ON DUPLICATE KEY UPDATE xp = xp + NEW.delta 

下面是完整的建議觸發器代碼:如果你想嘗試

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW 
BEGIN 
IF NOT EXISTS (SELECT 1 FROM resource_xp WHERE userId = NEW.userId) THEN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId); 
END IF; 

UPDATE resource_xp 
    SET xp = xp + new.delta 
    WHERE userId = new.userId; 

END $$ 
DELIMITER ; 

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT ON resource_xpEvents FOR EACH ROW 
BEGIN 

    REPLACE INTO resource_xp (userId,xp) values (NEW.userId,xp+new.delta); 

END $$ 
DELIMITER ; 

哪個更可讀

DELIMITER $$ 
CREATE TRIGGER test AFTER INSERT resource_xpEvents FOR EACH ROW 
BEGIN 
    INSERT INTO resource_xp (userId) 
    VALUES (NEW.userId) 
    ON DUPLICATE KEY UPDATE xp = xp + NEW.delta 
END $$ 
DELIMITER ;