Nano Hash - криптовалюты, майнинг, программирование

Увеличить счетчик или вставить строку в одном выражении в SQLite

В SQLite, учитывая эту схему базы данных

CREATE TABLE observations (
    src TEXT,
    dest TEXT,
    verb TEXT,
    occurrences INTEGER
);
CREATE UNIQUE INDEX observations_index
    ON observations (src, dest, verb);

всякий раз, когда появляется новый кортеж наблюдений (:src, :dest, :verb), я хочу либо увеличить столбец «вхождения» для существующей строки для этого кортежа, либо добавить новую строку с вхождениями = 1, если ее еще нет. В конкретном псевдокоде:

if (SELECT COUNT(*) FROM observations
        WHERE src == :src AND dest == :dest AND verb == :verb) == 1:
    UPDATE observations SET occurrences = occurrences + 1
        WHERE src == :src AND dest == :dest AND verb == :verb
else:
    INSERT INTO observations VALUES (:src, :dest, :verb, 1)

Мне интересно, можно ли выполнить всю эту операцию в одном выражении SQLite. Это упростило бы логику приложения (которая должна быть полностью асинхронной по отношению к операциям с базой данных), а также позволило бы избежать двойного поиска по индексу с точно таким же ключом. ВСТАВИТЬ ИЛИ ЗАМЕНИТЬ, похоже, не то, что я хочу, и, увы, нет ОБНОВЛЕНИЯ ИЛИ ВСТАВКИ.


  • Не лучше ли объявить occurrences как INTEGER? 06.09.2010

Ответы:


1

Я получил этот ответ от Игоря Тандетника на sqlite-users:

INSERT OR REPLACE INTO observations
VALUES (:src, :dest, :verb,
  COALESCE(
    (SELECT occurrences FROM observations
       WHERE src=:src AND dest=:dest AND verb=:verb),
    0) + 1);

Это немного, но стабильно быстрее, чем подход dan04.

07.09.2010
  • Извините, если это очевидно, но не забудьте создать уникальный индекс в соответствии с OP, иначе это всегда будет создавать новый счетчик и никогда не увеличивать: CREATE UNIQUE INDEX observations_index ON observations (src, dest, verb);. 07.08.2012
  • Также обратите внимание, что он увеличивает ROWID при каждом обновлении (поскольку каждое обновление по сути является DELETE + INSERT) 12.08.2013
  • Могу ли я узнать, должен ли он выполняться в рамках транзакции? 23.11.2020

  • 2

    Не знаю, как сделать это в одном выражении, но вы можете попробовать

    BEGIN;
        INSERT OR IGNORE INTO observations VALUES (:src, :dest, :verb, 0);
        UPDATE observeraions SET occurrences = occurrences + 1 WHERE
            src = :src AND dest = :dest AND verb = :verb;
    COMMIT;
    
    05.09.2010
    Новые материалы

    Кластеризация: более глубокий взгляд
    Кластеризация — это метод обучения без учителя, в котором мы пытаемся найти группы в наборе данных на основе некоторых известных или неизвестных свойств, которые могут существовать. Независимо от..

    Как написать эффективное резюме
    Предложения по дизайну и макету, чтобы представить себя профессионально Вам не позвонили на собеседование после того, как вы несколько раз подали заявку на работу своей мечты? У вас может..

    Частный метод Python: улучшение инкапсуляции и безопасности
    Введение Python — универсальный и мощный язык программирования, известный своей простотой и удобством использования. Одной из ключевых особенностей, отличающих Python от других языков, является..

    Как я автоматизирую тестирование с помощью Jest
    Шутка для победы, когда дело касается автоматизации тестирования Одной очень важной частью разработки программного обеспечения является автоматизация тестирования, поскольку она создает..

    Работа с векторными символическими архитектурами, часть 4 (искусственный интеллект)
    Hyperseed: неконтролируемое обучение с векторными символическими архитектурами (arXiv) Автор: Евгений Осипов , Сачин Кахавала , Диланта Хапутантри , Тимал Кемпития , Дасвин Де Сильва ,..

    Понимание расстояния Вассерштейна: мощная метрика в машинном обучении
    В обширной области машинного обучения часто возникает необходимость сравнивать и измерять различия между распределениями вероятностей. Традиционные метрики расстояния, такие как евклидово..

    Обеспечение масштабируемости LLM: облачный анализ с помощью AWS Fargate и Copilot
    В динамичной области искусственного интеллекта все большее распространение получают модели больших языков (LLM). Они жизненно важны для различных приложений, таких как интеллектуальные..