#php #sqlite #upsert
#sqlite
Вопрос:
Я запускаю приложение, которое использует 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:
ON CONFLICT...
или UPSERT
был добавлен в SQLite в версии 3.24.0.
В более ранних версиях вы можете получить аналогичную функциональность с помощью 2 отдельных инструкций.
Сначала попробуйте обновить таблицу:
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 = ?
exists ничего не произойдет (я предполагаю, что taxon_id
это PRIMARY KEY
значение таблицы или, по крайней мере, определено как UNIQUE
).
Если он не существует, то будет вставлена новая строка.