#sqlite
#sqlite
Вопрос:
Я использую SQLite 3.8, без поддержки upsert: https://www.sqlite.org/lang_UPSERT.html
У меня есть следующая таблица.
CREATE TABLE "data" (
"name" TEXT NOT NULL,
"counter" INTEGER NOT NULL
);
CREATE UNIQUE INDEX name_index ON data (name);
Я смог вставить или обновить счетчик, используя следующий способ.
INSERT OR REPLACE INTO data
VALUES ("the name",
COALESCE(
(SELECT counter FROM data
WHERE name="the name"),
0) 1);
Тем не менее, я также хотел бы иметь возможность возвращать вновь вставленный (или увеличенный) счетчик в одном операторе.
Я делаю это в 2 операторах, что может вызвать состояние гонки в многопоточном приложении.
2 оператора
INSERT OR REPLACE INTO data
VALUES ("the name",
COALESCE(
(SELECT counter FROM data
WHERE name="the name"),
0) 1);
SELECT counter FROM data where name="the name";
Возможно ли выполнить все в пределах 1 оператора?
Комментарии:
1. Разве вы не можете использовать
last_insert_rowid()
для получения нового созданного идентификатора?2. В приведенном выше примере нас интересует
counter
столбец.3. Понятно, это не столбец идентификаторов, извинения
4. Нет, вы не можете сделать это в одном операторе.
5. «Нет, вы не можете» — это рискованный ответ на StackOverflow, но с хорошим объяснением также может быть абсолютно отличным. @forpas