SQLite“;插入或替换到“中”;vs.“;更新。。。其中;

SQLite“;插入或替换到“中”;vs.“;更新。。。其中;,sqlite,upsert,Sqlite,Upsert,我以前从未见过SQL中使用的语法INSERT或REPLACE-INTO-names(id,name)value(1,“John”),我想知道为什么它比updatenames SET name=“John”更好,其中id=1。有什么好的理由用一个代替另一个吗。此语法是否特定于SQLite?如果该行不存在,则更新不会执行任何操作 其中,如果行不存在,则插入或替换将插入,如果行存在,则替换值。如果id=1不存在,则插入或替换查询将插入新记录 update查询仅在oudate id=1的情况下存在,如果

我以前从未见过SQL中使用的语法
INSERT或REPLACE-INTO-names(id,name)value(1,“John”)
,我想知道为什么它比
updatenames SET name=“John”更好,其中id=1
。有什么好的理由用一个代替另一个吗。此语法是否特定于SQLite?

如果该行不存在,则更新不会执行任何操作


其中,如果行不存在,则插入或替换将插入,如果行存在,则替换值。

如果id=1不存在,则插入或替换查询将插入新记录


update查询仅在oudate id=1的情况下存在,如果不存在,则不会创建新记录。

我目前正在处理这样一个语句,并找出另一个需要注意的事实: INSERT或REPLACE将替换语句中未提供的任何值。例如,如果您的表包含一列“lastname”,而您没有为该列提供值,则INSERT或REPLACE将在可能的情况下使“lastname”为空(约束允许)或失败

是一种较短形式的

INSERT OR REPLACE INTO table(column_list) VALUES(value_list);
为了正确执行REPLACE,表结构必须具有唯一的行,无论是简单的主键还是唯一的索引

REPLACE deletes,然后插入记录,如果设置了插入触发器,将导致执行插入触发器。如果插入时有触发器,则可能会遇到问题


这是一个变通办法。。没有检查速度

INSERT OR IGNORE INTO table (column_list) VALUES(value_list);

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'

此方法允许在不触发触发的情况下进行替换。

谢谢您的回答。这是一个特定于SQLite的东西吗?我不知道这个inSql服务器,尽管Sql server现在有一个MERGE命令。rom MS Access我也没有见过类似的情况。在这个问题中,说明replace into将始终首先删除该行,而update不会明确说明@Seppl有用注释的含义:始终在“updated”行中指定所需的完整值集;因为旧的行首先被删除,所以它的所有值都不会被保留。@AdrianStander我听说“REPLACE执行删除和插入”,对吗?我认为这是不对的。sqlite文档(截至2010年7月1日,版本3.6.23.1)指出,
REPLACE是INSERT或REPLACE的别名,因此具有相同的行为。根据我的经验,就是这样。我想如果它找到一个conflict@fostandyREPLACE确实是INSERT或REPLACE的别名,但您评论的答案是关于更新的(因为这就是问题所在)。+1;换言之:始终指定“更新”行应具有的完整值集-不保留任何现有值;这种行为的原因是,实际上不是对现有行的更新操作,而是删除,然后重新插入。
UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'