问题描述
我有一个表的字段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
。它取决于主键或唯一键的使用。