为什么UPSERT执行DELETE和INSERT而不是UPDATE(SQLite)

时间:2015-03-23 16:12:33

标签: sql sqlite upsert

我想知道为什么,当至少使用Peewee时,当条目已经在表中时,UPSERT会执行DELETE和INSERT而不是UPDATE?

是否有任何理由可以优先使用"删除然后插入"而不是"尝试UPDATE否则插入"?

UPDATE比DELETE&更快时间插入?或者UPSERT真的意味着INSERT(强制=真)查询吗?

2 个答案:

答案 0 :(得分:0)

  

我想知道为什么,当至少使用Peewee时,当条目已经在表中时,UPSERT会执行DELETE和INSERT而不是UPDATE吗?

Peewee没有明确地删除然后插入。如果您使用的是 支持upsert的SQLite,那么peewee将发出:

INSERT OR REPLACE INTO <table> ...

这就是peewee实现upsert的方式。 Peewee本身不会发出单独的DELETE声明。

请参阅https://www.sqlite.org/lang_replace.html

答案 1 :(得分:0)

不是更好:

UPDATE t SET a = 'pdf' WHERE id = 2;
INSERT INTO t(id, a) SELECT 2, 'pdf' WHERE changes() = 0;

如果更新失败,则更改()= 0,以便进行插入。