66

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

4

4 回答 4

98

如果该行不存在,UPDATE 将不执行任何操作。

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

于 2010-02-12T12:19:53.427 回答
35

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

于 2012-09-26T14:58:47.643 回答
19
REPLACE INTO table(column_list) VALUES(value_list);

是一种较短的形式

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

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

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


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

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

其次是

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

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

于 2016-11-16T15:38:50.433 回答
5

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

更新查询将仅在它存在时 oudate id=1,如果它不存在则不会创建新记录。

于 2010-02-12T12:21:28.713 回答