2012-06-03 25 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

我不是批评,只是注意一个可能的选择。我会走多远将取决于我在当时感受的教授:) –

相关问题