在SQL中插入或更新

时间:2011-09-17 08:50:54

标签: sql database sqlite

想象一个从字符串映射到两个整数的表。如果键不在表中,我想插入一个新行,或者通过将整数(key, oldx+x, oldy+y)相加来更新现有行。我会做很多事情,我想知道我是否可以在一个操作中执行此操作而不是第一个SELECT来检查行是否存在,然后INSERTUPDATE以及为这可能会导致两次查找。

我是SQL的新手,我无法想出如何以有效的方式做到这一点。

4 个答案:

答案 0 :(得分:4)

SQLite支持INSERT OR REPLACE,需要比大多数人想象的更加小心。有关详细信息,请参阅this SO answer,并记住在替换期间级联删除的可能性。

答案 1 :(得分:2)

两者都有效:

UPDATE TABLE SET x=x+?, y=y+? WHERE key = ?; -- will do nothing if key not found

INSERT INTO TABLE (key, x, y)
SELECT ?, ?, ?
WHERE NOT EXISTS (SELECT * FROM TABLE WHERE key = ?); -- will do nothing if key found

只有一个会影响表格中的数据。

答案 2 :(得分:1)

不确定数据库如何支持Upsert

答案 3 :(得分:1)

-- Insert record with key=k if it does not exist yet.
-- the zero's could also be handled by appropiate defaults for oldx,oldy 
INSERT INTO tab (key, oldx, oldy) select k,0,0 
    WHERE NOT EXISTS (SELECT 1 FROM tab where key=k)
    ;

UPDATE tab
    SET oldx=oldx+y, oldy=oldy+y
    WHERE key = k
    ;