UPSERT для "INSERT INTO вкладка SELECT * FROM another_tab" - PullRequest
0 голосов
/ 02 апреля 2020

Как мне сделать "UPSERT" (INSERT OR UPATE) в таблицу SQLite при вставке нескольких строк из другой таблицы .

Я пробовал:

INSERT INTO tab_name
SELECT * FROM tmp
ON CONFLICT(id)
    DO UPDATE SET
      val = excluded.val;

Но это дает мне:

Синтаксическая ошибка рядом с "DO"

Что было бы правильным и наиболее эффективным способом достижения этого?

1 Ответ

1 голос
/ 02 апреля 2020

Возможно, вы попали в задокументированную ловушку с именем Неоднозначность разбора :

Когда оператор INSERT, к которому присоединен UPSERT, принимает свои значения из SELECT Заявление, есть потенциальная неоднозначность разбора. Синтаксический анализатор может не определить, вводится ли ключевое слово "ON" UPSERT или это предложение ON объединения. Чтобы обойти это, оператор SELECT всегда должен включать в себя предложение WHERE, даже если это предложение WHERE просто "WHERE true".)

Итак, это работает лучше?

INSERT INTO tab_name
SELECT * FROM tmp WHERE true
ON CONFLICT(id) DO UPDATE SET val = excluded.val;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...