在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
;