【问题标题】:MySQL -- Update if exists else insert with two keysMySQL -- 如果存在则更新,否则使用两个键插入
【发布时间】:2011-05-29 16:13:59
【问题描述】:

我有一个包含字段 foreign_key_id | 的表值1 | value2,如果我匹配 foreign_key_id 和 value1,我想更新 value2。

如果 foreign_key_id 或 value1 不存在,我想插入一个新行。有没有比让 PHP 使用 select 语句然后分支到更新或插入更好的方法?

编辑:value2可以和数据库中的值一样,所以不能运行更新,看看affected_rows是否为0,如果是则运行插入。

【问题讨论】:

  • foreign_key_id 是唯一的还是主要的?什么版本的 MySQL?
  • 我目前没有将它设置为键。 foreign_key_id 和 value1 都不是唯一的。 MySQL 是 v5.1.36。

标签: php mysql sql


【解决方案1】:

尝试使用IF EXISTS 来确定是执行UPDATE 还是INSERT 语句。您可以在一个 PHP 语句/查询中执行此操作。

IF EXISTS(SELECT 1 FROM Mytable WHERE foreign_key_id = f1 AND value1 = v1)
BEGIN
    UPDATE Mytable SET value2 = v2
    WHERE foreign_key_id = f1 AND value1 = v1;
END
ELSE
BEGIN
      INSERT INTO Mytable(foreign_key_id,value1,value2)
      VALUES (f1,v1,v2);
END IF;

【讨论】:

  • 太棒了。感谢您的回答。它对我也有用。
  • 我是否需要扩展才能在 MySQL 中运行此代码?它对我不起作用,并且 IF EXISTS(SELECT 1 FROM Mytable WHERE foreign_key_id = f1 AND value1 = v1) END IF;也不行。
【解决方案2】:

是的,您可以运行更新,然后运行get the number of affected rows。如果为 0,则运行插入。这将为您节省一个选择,因为它包含在更新中。

[编辑]

在 cmets 中发布的查询。使用选择插入。这将预先保存一个选择。您可以使用 mysql_affected_rows 来获取插入的行数。如果返回 0,则可以更新。它实际上包含选择,所以我不确定它是否更快(mysql 和子选择不完全是朋友)。但是,它会为您节省往返数据库的时间,这可能会弥补这一点。

insert into yourtable(f1, f2, fr) 
select 'value1', 'value2', 'value3' 
from dual /* yeah, I'm an Oracle dude */
where 
  not exists (
      select 'x' 
      from yourtable 
      where f1 = 'value1' and f2 = 'value2')

【讨论】:

  • 我不能这样做,因为 value2 可以是前后相同的值,这将创建一个重复的行。我将编辑我的帖子以反映此信息。
  • 在这种情况下,您可以在另一个答案中使用程序块,也可以使用 REPLACE 语句。 Replace 类似于 INSERT,但如果记录已经存在,它会替换它。 dev.mysql.com/doc/refman/5.0/en/replace.html 不确定这是否正是您想要的。直到现在才知道更换。 ;)
  • 我不能使用replace,因为这两个键都不是唯一的——只有foreign_key_id和value1的组合是唯一的
  • 好吧,在那种情况下,没有多少其他解决方案。您可以使用 select 插入 insert into yourtable(f1, f2, fr) select 'value1', 'value2', 'value3' where not exists (select 'x' from yourtable where f1 = 'value1' and f2 = 'value2' 这将为您节省选择。您可以只更新数据库,并在插入语句中具有此条件。但是你必须尝试看看它是否更快。
  • 将上面的陈述放在答案中以获得更好的可读性。
【解决方案3】:

如果您无法让 p.campbell 的解决方案发挥作用,请尝试这种轻微的修改

IF EXISTS(SELECT 1 FROM Mytable WHERE foreign_key_id = f1 AND value1 = v1) THEN
    UPDATE Mytable SET value2 = v2
    WHERE foreign_key_id = f1 AND value1 = v1;
ELSE
    INSERT INTO Mytable(foreign_key_id,value1,value2)
    VALUES (f1,v1,v2);
END IF;

【讨论】:

    【解决方案4】:

    最佳选择:使用REPLACE 而不是INSERTUPDATE。这取决于主键或唯一键的使用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-12-10
      • 1970-01-01
      • 2017-09-27
      • 1970-01-01
      • 1970-01-01
      • 2011-08-27
      • 2014-10-23
      • 2013-04-19
      相关资源
      最近更新 更多