在SQL中插入或更新

在SQL中插入或更新,sql,database,sqlite,Sql,Database,Sqlite,想象一个从字符串映射到两个整数的表。如果键不在表中,我想插入一个新行,或者通过将整数(键,oldx+x,oldy+y)相加来更新现有行。我将经常这样做,我想知道我是否可以在一次操作中完成这项工作,而不是首先选择检查行是否存在,然后插入或使用总和更新,因为这可能会导致两次查找 我是SQL新手,我不知道如何以一种高效的方式实现这一点。不确定您的数据库如何支持 两种方法都可以: UPDATE TABLE SET x=x+?, y=y+? WHERE key = ?; -- will do nothin

想象一个从字符串映射到两个整数的表。如果键不在表中,我想插入一个新行,或者通过将整数
(键,oldx+x,oldy+y)
相加来更新现有行。我将经常这样做,我想知道我是否可以在一次操作中完成这项工作,而不是首先选择
检查行是否存在,然后插入
使用总和更新
,因为这可能会导致两次查找


我是SQL新手,我不知道如何以一种高效的方式实现这一点。

不确定您的数据库如何支持

两种方法都可以:

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

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

SQLite支持插入或替换,使用时需要比大多数人想象的更加小心。有关详细信息,请参阅,并记住在替换过程中级联删除的可能性。

您使用的是哪种DBMS?PostgreSQL、Oracle、Firebird、DB2、SQL Server、MySQL?这对我不起作用。SELECT WHERE NOT EXISTS正在为数据库中与最终WHERE子句不匹配的每一行返回一行。。。因此,它多次插入新记录。
-- 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
    ;