想象一个从字符串映射到两个整数的表。如果键不在表中,我想插入一个新行,或者通过将整数(key, oldx+x, oldy+y)
相加来更新现有行。我会做很多事情,我想知道我是否可以在一个操作中执行此操作而不是第一个SELECT
来检查行是否存在,然后INSERT
或UPDATE
以及为这可能会导致两次查找。
我是SQL的新手,我无法想出如何以有效的方式做到这一点。
答案 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
;