2015-03-23 4 views
0

Мне было интересно, почему при использовании Peewee по крайней мере UPSERT делает DELETE и INSERT, а не UPDATE, когда запись уже находится в таблице?Почему UPSERT делает DELETE и INSERT вместо UPDATE (SQLite)

Есть ли причина, по которой было бы предпочтительнее «УДАЛИТЬ, а затем ВСТАВИТЬ», а не «попробовать ОБНОВЛЕНИЕ в противном случае INSERT»?

ОБНОВЛЕНИЕ более дорогостоящее, чем DELETE & INSERT? Или UPSERT действительно означает запрос INSERT (force = True)?

+1

Я не думаю, что SQLite поддерживает UPSERT .. там нет документации об этом: https://www.sqlite.org/docs.html – BeNdErR

+0

мой плохой. По-видимому, этот слой обрабатывается Peewee. Juste отредактировал вопрос. Однако из того, что я прочитал, это похоже на общую реализацию. – bsuire

+0

Возможно, что данные в обновлении занимают больше места и не могут быть обновлены на месте. –

ответ

0

Мне было интересно, почему при использовании Peewee по крайней мере UPSERT делает DELETE и INSERT, а не UPDATE, когда запись уже находится в таблице?

Peewee явно не делает удаление, а затем вставляет. Если вы используете SQLite, который делает поддержки upsert, то Peewee будет выдавать:

INSERT OR REPLACE INTO <table> ... 

Это как PeeWee реализует upsert. Сам Peewee не будет выпускать отдельный оператор DELETE.

См https://www.sqlite.org/lang_replace.html

0

не это лучше:

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

Если обновление не удается, то изменения() = 0, так что делает вставку.

Смежные вопросы