Как я могу получить идентификатор записи в выходящей таблице или вставить новую, если она не существует эффективно? - PullRequest
0 голосов
/ 18 августа 2010

Я использую SQLite для поддержки базы данных, которая содержит, помимо прочего, таблицу с путями. Оператор CREATE для таблицы выглядит следующим образом

CREATE TABLE path (id INTEGER PRIMARY KEY AUTOINCREMENT,
                   name TEXT,
                   UNIQUE(name));

Я ищу короткий способ сказать «вставьте этот заданный путь в таблицу путей и дайте мне идентификатор, которому он был назначен, или просто дайте мне идентификатор, если он уже существует» в SQL.

Сейчас я делаю это с помощью нескольких операторов SQL (псевдокод вперед):

unsigned int getIdForPath(p) {
  result = exec("SELECT id FROM path WHERE name='$p';");
  if result.empty {
    exec("INSERT INTO path VALUES(NULL, '$p');");
    result = exec("SELECT last_insert_rowid() FROM path;");
  }
  return result.toInt();
}

Итак, я сначала пытаюсь найти идентификатор; если он, кажется, не существует, я добавляю новую запись и, наконец, делаю еще один SELECT, чтобы получить последний использованный идентификатор. Это кажется немного неуклюжим и, возможно, неэффективным.

Есть ли более компактный и / или эффективный способ реализации этой логики?

ОБНОВЛЕНИЕ : Распространенным случаем является то, что запись уже существует , поэтому начальный SELECT в приведенном выше псевдокоде найдет результат в большинстве случаев.

1 Ответ

1 голос
/ 18 августа 2010

Вы можете сделать это в два этапа, используя INSERT OR IGNORE , чтобы вставить значение, если оно еще не существует, и затем выбрать id элемента.

...