SQLite"INSERT OR REPLACE INTO"与"UPDATE ... WHERE"

nev*_*ing 58 sqlite upsert

我以前从未见过INSERT OR REPLACE INTO names (id, name) VALUES (1, "John")SQL中使用的语法,我想知道它为什么比它好UPDATE names SET name = "John" WHERE id = 1.是否有任何理由使用其中一个.这种语法是否特定于SQLite?

Adr*_*der 86

如果行不存在,UPDATE将不会执行任何操作.

如果行不存在则插入INSERT OR REPLACE,否则替换值.

  • 在这个问题http://stackoverflow.com/questions/690632/how-do-i-update-a-row-in-a-table-or-insert-it-if-it-doesnt-exist中声明替换为将始终删除该行,而更新不会 (5认同)
  • 要明确说明@ Seppl有用注释的含义:_always在"updated"row_中指定所需的完整值集; 由于旧行首先被删除,因此不保留任何值. (3认同)

cyb*_*gen 31

我正在处理这样的声明,并想出另一个需要注意的事实:INSERT OR REPLACE将替换语句中未提供的任何值.例如,如果您的表包含一个您没有提供值的"lastname"列,INSERT OR REPLACE将尽可能使"lastname"无效(约束允许)或失败.

  • +1; 换句话说:总是指定_complete值集_"更新"行应该具有 - 没有保留现有值; 这种行为的原因实际上不是现有行的*update*操作,而是删除,然后是重新插入. (7认同)

Pod*_*.io 8

REPLACE INTO table(column_list) VALUES(value_list);
Run Code Online (Sandbox Code Playgroud)

是一种较短的形式

INSERT OR REPLACE INTO table(column_list) VALUES(value_list);
Run Code Online (Sandbox Code Playgroud)

要使REPLACE正确执行,您的表结构必须具有唯一的行,无论是简单的主键还是唯一的索引.

REPLACE删除,然后INSERT记录,如果你设置它们将导致INSERT触发器执行.如果您在INSERT上有触发器,则可能会遇到问题.


这是一个解决方法..没有检查速度..

INSERT OR IGNORE INTO table (column_list) VALUES(value_list);
Run Code Online (Sandbox Code Playgroud)

其次是

UPDATE table SET field=value,field2=value WHERE uniqueid='uniquevalue'
Run Code Online (Sandbox Code Playgroud)

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


Ano*_*nym 5

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

如果存在,则更新查询只会输出 id=1,如果它不存在,则不会创建新记录。

  • 我不认为这是正确的。sqlite 文档(截至 2010 年 7 月 1 日,版本 3.6.23.1)说`REPLACE 是 INSERT OR REPLACE` 的别名,因此具有相同的行为。以我的经验是这样的.. (2认同)
  • @fostandy REPLACE 确实是 INSERT OR REPLACE 的别名,但是您评论的答案是关于 UPDATE (因为这就是问题所在)。 (2认同)