Альтернатива SQLite INSERT … ПРИ КОНФЛИКТЕ … ГДЕ … ВЫПОЛНИТЬ ОБНОВЛЕНИЕ НАБОРА

#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 ).
Если он не существует, то будет вставлена новая строка.