2012-06-03 26 views
3

當我嘗試選擇和更新同桌MySQL允許誤差MYSQL觸發從選擇和更新相同的表給出了錯誤#1241 - 操作數應包含1列(S)

error 
#1241 - Operand should contain 1 column(s) 

觸發器是

DELIMITER $$ 
CREATE TRIGGER visitor_validation 
BEFORE INSERT ON ratingsvisitors 
FOR EACH ROW 
BEGIN 
SET @ifexists = (SELECT * FROM ratingcounttracks WHERE userid=New.vistorid AND likedate=New.likevalidation AND countfor=New.likeordislike); 
IF (@ifexists = NULL) THEN 
INSERT INTO ratingcounttracks(userid, likedate, clickcount,countfor) values (New.vistorid, New.likevalidation ,'1',New.likeordislike); 
ELSE 
UPDATE ratingcounttracks SET clickcount=clickcount+1 WHERE userid=New.vistorid AND likedate=New.likevalidation AND countfor=New.likeordislike; 
END IF; 
END$$ 
+0

你所試圖做的是叫做* UPSERT *。您可能想了解更多,因爲有不同的方法。在這個網站上有關於MySQL的upsert的問題。你可以從[這一個]開始(http://stackoverflow.com/questions/1218905/how-do-i-update-if-exists-insert-if-not-aka-upsert-or-merge-in-mysql 「如果存在,我如何更新?如果不是(在MySQL中插入或插入)?」),然後按照* Linked *部分中的說明進行更新。 –

回答

1

問題是你正在選擇多個列(SELECT * FROM ...)轉換成單個可變@ifexists)。

解決方案是而不是使用變量! 「如果不存在,否則插入更新」:只要使用普通的SQL IF NOT EXISTS (...)

DELIMITER $$ 
CREATE TRIGGER visitor_validation 
BEFORE INSERT ON ratingsvisitors 
FOR EACH ROW 
BEGIN 
IF NOT EXISTS (SELECT * FROM ratingcounttracks WHERE userid=New.vistorid AND likedate=New.likevalidation AND countfor=New.likeordislike) THEN 
    INSERT INTO ratingcounttracks(userid, likedate, clickcount,countfor) values (New.vistorid, New.likevalidation ,'1',New.likeordislike); 
ELSE 
    UPDATE ratingcounttracks SET clickcount=clickcount+1 WHERE userid=New.vistorid AND likedate=New.likevalidation AND countfor=New.likeordislike; 
END IF; 
END$$ 
+0

甚至「如果不存在(從...中選擇1)」。 –

+0

@ muistooshort當然。它會*非常*更有效率。一般情況下(我確定你也這樣做),我試着對發佈的代碼做一點改動,以便OP能夠看到變化並理解它。除非代碼是如此糟糕,否則沒有什麼值得回收的,然後我發表重寫。 – Bohemian

+0

我不是批評,只是注意一個可能的選擇。我會走多遠將取決於我在當時感受的教授:) –

相關問題