SQLite“INSERT OR REPLACE INTO”与“UPDATE ... WHERE”

时间:2010-02-12 12:18:03

标签: sqlite upsert

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

4 个答案:

答案 0 :(得分:84)

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

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

答案 1 :(得分:31)

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

答案 2 :(得分:8)

REPLACE INTO table(column_list) VALUES(value_list);

的缩写形式
INSERT OR REPLACE INTO table(column_list) VALUES(value_list);

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

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

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

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

接着是

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

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

答案 3 :(得分:4)

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

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