MySQL - 更新如果存在,则插入两个键

时间:2011-05-29 16:13:59

标签: php mysql sql

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

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

编辑:value2可以是与数据库中相同的值,因此我无法运行和更新,看看affected_rows是否为0,如果是,则运行并插入。

4 个答案:

答案 0 :(得分:8)

尝试使用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;

答案 1 :(得分:4)

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

[编辑]

在评论中发布的查询。使用select插入。这将节省一个选择前期。您可以使用mysql_affected_rows来获取插入的行数。如果返回0,则可以更新。它实际上包含select,所以我不确定它是不是很好(mysql和subselects不是完全朋友)。它会为您节省数据库往返,但这可能只是弥补了这一点。

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')

答案 2 :(得分:1)

如果你无法获得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;

答案 3 :(得分:0)

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