我有一个包含字段foreign_key_id |的表value1 | value2,如果我匹配foreign_key_id和value1,我想更新value2。
如果foreign_key_id或value1不存在,我想插入一个新行。有没有更好的方法来让PHP使用select语句然后分支到更新或插入?
编辑:value2可以是与数据库中相同的值,因此我无法运行和更新,看看affected_rows是否为0,如果是,则运行并插入。
答案 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
代替INSERT
或UPDATE
。这取决于主键或唯一键的使用。