MySQL —更新是否存在,否则插入两个键

问题描述

我有一个表的字段foreign_key_id | value1 | value2,如果我有对Foreign_key_id和value1的匹配项,我想更新value2。 如果foreign_key_id或value1不存在,我想插入一个新行。有没有比PHP使用select语句然后分支到更新或插入更好的方法呢? 编辑:value2可以与数据库中的值相同,因此我无法运行和更新,请查看受影响的行是否为0,如果是,请运行并插入。     

解决方法

        尝试使用“ 0”确定是执行“ 1”还是“ 2”语句。您可以在一个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;
    ,        是的,您可以只运行更新,然后获取受影响的行数。如果为0,则运行插入。这将为您节省选择,因为它包含在更新中。 [编辑] 按评论中的查询。使用选择插入。这将保存选择的预付款。您可以使用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\')
    ,        如果您无法获得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,value2)
    VALUES (f1,v2);
END IF;
    ,        最佳选择:使用
REPLACE
代替
INSERT
UPDATE
。它取决于主键或唯一键的使用。