Синтаксическая ошибка с upsert при использовании последней версии - PullRequest
0 голосов
/ 03 апреля 2020

Я пытаюсь выполнить следующий запрос:

INSERT INTO `xguilds_relations` ( `id1`, `id2`, `dominance` ) VALUES ( ?, ?, ? )
    ON CONFLICT DO UPDATE SET `dominance` = VALUES(`dominance`);

Однако это приводит к следующей синтаксической ошибке:

SQL ошибка или отсутствует база данных ( возле "ОБНОВЛЕНИЕ": синтаксическая ошибка)

Я некоторое время просматривал Google и Stackoverflow, и все, что я обнаружил, это то, что UPSERT поддерживается только с SQLite 3.24.0. Тем не менее, я использую 3.30.1, и он все еще не работает.

Чего я хотел бы добиться:
- Вставить новую строку в xguilds_relations с предоставленными id (таблица содержит CHECK (id1 > id2) или что-то подобное) и предоставленный dominance - Если строка с указанными id уже существует, обновите эту строку новым dominance значением

Ответы [ 2 ]

0 голосов
/ 03 апреля 2020

UPSERT работает, когда есть нарушение ограничения UNIQUE, а не ограничения CHECK. Есть ли ограничение UNIQUE для комбинации id1 и id2? Я верю нет. Итак, создайте его:

CREATE UNIQUE INDEX IF NOT EXISTS un_id1_id2 ON `xguilds_relations` (`id1`, `id2`);

Теперь напишите утверждение следующим образом:

INSERT INTO `xguilds_relations` ( `id1`, `id2`, `dominance` ) VALUES ( ?, ?, ? )
ON CONFLICT(id1, id2) DO UPDATE SET `dominance` = <value>;

См. Упрощенную демоверсию .

0 голосов
/ 03 апреля 2020

Я не думаю, что SQLite поддерживает VALUES. Это работает?

INSERT INTO xguilds_relations ( id1, id2, dominance )
    VALUES ( ?, ?, ? )
    ON CONFLICT DO UPDATE SET dominance = excluded.dominance;

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

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