MySQL如果行存在则更新其他插入

时间:2015-03-29 08:31:29

标签: mysql

我正在尝试建立一个网站,人们可以注册活动+分配给该活动的活动。他们可以选择他们想要参加哪一个,甚至两个。

为此,我创建了一个名为“eventCounter”的表 Image of table
userID,eventID和activityID都是FK poiting到其他表。

他们应该能够更新当前的“状态”,以便他们在注册活动后加入活动。

所以我的问题是:我如何制作如果否则说明行是否存在更新其他插入

IF EXISTS(select userID, eventID, activityID from eventCounter where userID=1 and eventID=1)
THEN 
UPDATE eventcounter SET activityID=1 WHERE userID=1; 
ELSE 
INSERT INTO eventcounter (userID, activityID) VALUES(1,1)

我认为ON DUPLICATE键不起作用,因为我需要检查2列?

2 个答案:

答案 0 :(得分:1)

这就是所谓的Upsert。 MySQL的语法非常奇怪,但你可以这样做,比如:

INSERT INTO eventcounter (userID, eventID, activityID) VALUES(1,1,1)
ON DUPLICATE KEY UPDATE
  activityID = VALUES(activityID)

它仅适用于重复的PK(不适用于您喜欢的任何字段),因此在这种情况下,仅当userIDeventID组成PK并且您只想更改{时{1}}

否则,您可以使用IF-ELSE路线,例如:

activityID

免责声明:完全未经测试的代码

答案 1 :(得分:0)

到了 2021 年,事情发生了变化!所以我正在更新旧的 @Jcl 的回答:

您必须记住的一件事是,此语句仅在插入时 PRIMARY KEYUNIQUE INDEX 发生重复时才有效(所以不仅 PKindex 也有效)!


SQL command:

INSERT INTO fooTable (RowNum, name, lastname, userID, score) VALUES(3,'Michael','Widenius','1012141618',19.75)
ON DUPLICATE KEY UPDATE name = 'Allan', lastname = 'Larsson', userNum = '2022242628', score = 10.50;

注意:

  • 不推荐使用 VALUES() 来引用新的行和列(Reference)
  • 命令也在最新的 MYSQL 8.0PHP Mysqli 上进行了测试。
  • 上面的命令只是告诉你,如何更新多行;在现实世界中,大多数情况下您不需要更新所有 namelastnameuserID,以防记录已经存在并且 score 就足够了!< /li>

我发现它非常直接且易于执行,您几乎可以检查案例中每个重要字段的重复(使用 UNIQUE INDEXs)! 记住第一行...