【问题标题】:MYSQL trigger to select from and update the same table gives error #1241 - Operand should contain 1 column(s)MYSQL 触发器选择和更新同一个表给出错误 #1241 - 操作数应包含 1 列
【发布时间】:2012-06-03 04:29:26
【问题描述】:

当我尝试选择和更新同一个表时,mysql 给出错误

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$$

【问题讨论】:

  • 您正在尝试做的事情称为 UPSERT:“如果存在则更新,否则插入”。您可能想了解更多关于它的信息,因为有不同的方法。此站点上有关于 MySQL 中的 upsert 的问题。您可以从 this one 开始,然后按照其 Linked 部分中的内容进行操作。

标签: mysql sql triggers mysql-error-1241


【解决方案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$$

【讨论】:

  • 甚至if not exists (select 1 from ...)
  • @muistooshort 当然。它会非常稍微更有效率。一般来说(我相信你也会这样做)我尽量对发布的代码做些小改动,以便 OP 可以看到更改并理解它。除非代码如此糟糕,否则没有什么值得挽救的,然后我发布一个重写。
  • 我不是在批评,只是指出一个可能的替代方案。我能走多远取决于我当时的教授感觉:)
猜你喜欢
  • 2013-03-27
  • 2020-01-14
  • 2016-12-23
  • 1970-01-01
  • 2013-10-04
  • 2023-03-21
  • 1970-01-01
  • 2018-05-01
  • 1970-01-01
相关资源
最近更新 更多