Альтернатива SQLite INSERT ... ON CONFLICT ... WHERE ... DO UPDATE SET - PullRequest
0 голосов
/ 26 мая 2020

Я запускаю приложение, использующее SQLite3 версии 3.7.17 на Linux. Ошибка в этом утверждении:

INSERT INTO taxa (taxon_id, rank, parent_id) VALUES (?,?,?)
        ON CONFLICT (taxon_id) WHERE parent_id is NULL
        DO UPDATE SET parent_id=excluded.parent_id,rank=excluded.rank

Но тот же код работает в версии 3.28.0. Есть ли другой способ написать этот оператор, чтобы он мог работать в 3.7.17?

1 Ответ

1 голос
/ 26 мая 2020

ON CONFLICT... или UPSERT были добавлены в SQLite в версии 3.24.0.

В более ранних версиях вы можете получить аналогичную функциональность с двумя отдельными операторами.

Сначала попробуйте обновить таблицу:

UPDATE taxa 
SET rank = ?, parent_id = ?
WHERE taxon_id = ?;

Если строка с taxon_id = ? существует, она будет обновлена. Если его не будет, ничего не произойдет.

Затем попробуйте вставить новую строку с INSERT OR IGNORE:

INSERT OR IGNORE INTO taxa (taxon_id, rank, parent_id) VALUES (?, ?, ?);

Если существует строка с taxon_id = ?, ничего не произойдет (я предполагаю, что taxon_id - это PRIMARY KEY таблицы или, по крайней мере, определяется как UNIQUE). Если он не существует, будет вставлена ​​новая строка.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...