愚蠢但简单的例子:假设我有一个表“项目”,我保存收到的项目的总计。 Item_Name Items_In_Stock 项目名称是主键。 当我收到数量为X的物品A时,如何达到以下要求。 如果项目不存在,则为项目A插入一个新的logging,并将库存项目设置为X,如果存在库存项目为Y的logging,则库存项目中的新值为(X + Y) INSERT INTO `item` (`item_name`, items_in_stock) VALUES( 'A', 27) ON DUPLICATE KEY UPDATE `new_items_count` = 27 + (SELECT items_in_stock where item_name = 'A' ) 我的问题是,我在我的实际表中有多个列。 在更新部分写多个select语句是一个好主意吗? 当然,我可以在代码中做到这一点,但有没有更好的办法?
MySQL有这样的东西: INSERT INTO visits (ip, hits) VALUES ('127.0.0.1', 1) ON DUPLICATE KEY UPDATE hits = hits + 1; 据我所知这个function在SQLite中不存在,我想知道的是,如果有任何方法来归档相同的效果,而不必执行两个查询。 另外,如果这是不可能的,你更喜欢什么: SELECT +(INSERT或UPDATE)或 更新(+ INSERT 如果更新失败 )
有一个简单的方法来INSERT一个行,当它不存在,或UPDATE如果它存在,使用一个MySQL查询?
http://en.wikipedia.org/wiki/Upsert 在SQL Server中插入更新存储过程 有没有一些聪明的方式来做到这一点,我没有想到的SQLite? 基本上我想更新四列中的三个,如果logging存在,如果它不存在,我想插入logging与第四列的默认(NUL)值。 ID是一个主键,所以只有一个logging到UPSERT。 (我试图避免SELECT的开销,以确定如果我需要更新或INSERT显然) build议?
假设MyTable(KEY, datafield1, datafield2…)的表结构MyTable(KEY, datafield1, datafield2…) 。 通常我想要更新现有logging,或者如果不存在,则插入新logging。 主要有: IF (key exists) run update command ELSE run insert command 什么是最好的performance方式来写这个?
这里一个非常常见的问题是如何做一个upsert,这就是MySQL调用INSERT … ON DUPLICATE UPDATE和标准支持作为MERGE操作的一部分。 鉴于PostgreSQL不直接支持(在第9.5页之前),你如何做到这一点? 考虑以下几点: CREATE TABLE testtable ( id integer PRIMARY KEY, somedata text NOT NULL ); INSERT INTO testtable (id, somedata) VALUES (1, 'fred'), (2, 'bob'); 现在设想你想要“插入”元组(2, 'Joe') , (3, 'Alan') ,所以新的表格内容是: (1, 'fred'), (2, 'Joe'), — Changed value of existing tuple (3, 'Alan') — Added new tuple 这就是人们在讨论一个upsert时候正在讨论的问题。 至关重要的是,任何方法在同一个表上进行多个事务的情况下都必须是安全的 – […]
几个月前,我从Stack Overflow的一个答案中学习了如何在MySQL中使用以下语法一次执行多个更新: INSERT INTO table (id, field, field2) VALUES (1, A, X), (2, B, Y), (3, C, Z) ON DUPLICATE KEY UPDATE field=VALUES(Col1), field2=VALUES(Col2); 我现在切换到PostgreSQL,显然这是不正确的。 这是指所有正确的表,所以我认为这是一个不同的关键字正在使用的问题,但我不知道这是在PostgreSQL文档涵盖。 为了澄清,我想插入几件事情,如果他们已经存在,以更新它们。
UPSERT操作可以更新或在表中插入一行,具体取决于表中是否有一行与数据匹配的行: if table t has a row exists that has key X: update t set mystuff… where mykey=X else insert into t mystuff… 由于Oracle没有特定的UPSERT语句,最好的办法是什么?