Вставьте запись, затем обновите другую таблицу

-4

Я пытаюсь обернуть голову тем, как эффективно вставлять данные в таблицу, которая не имеет всей информации заранее.

У меня есть две таблицы: Table1 и Table2. Первым ключом Table2 является автоинкремент int. Этот int служит идентификатором для строки и также находится в столбце в Table1 (не уникален, поэтому несколько записей в Table1 могут иметь один и тот же Table2.ID). Проблема заключается в том, как добавить новую запись в Table1, автоматически заполняет соответствующее значение Table2.ID?

Моя логика:

  1. Table2 чтобы узнать, существует ли запись.
  2. Если он существует, верните значение ID и вставьте новую запись в Таблицу 1 с этим значением ID
  3. Если он не существует, вставьте новую запись в таблицу2 и верните идентификатор
  4. Вставьте новый идентификатор в соответствующую колонку Table1

Возможно ли, что SQLite автоматизирует вставку соответствующего идентификатора, а не мне приходится делать это в коде (чтение вокруг, я сталкивался с триггерами, но не уверен, как их использовать или если они полезны здесь)?

Обновленный вопрос с примером (мне не разрешено обсуждать аспекты реальной игры, над которой я работаю, но этот придуманный пример похож на характер)

Таблица 2 будет называться Genre а таблица 1 будет называться Film а все таблицы пустые. Жанр PK (auto int) будет связан с колонкой Genre (int) в таблице Film. В таблице Film нет столбца varchar для хранения текстовой версии жанра, только столбца int.

Я вставляю новую запись Film и передаю в Horror как жанр. Однако в это время в таблице Genre нет записей Horror, поэтому нет значения int, которое может быть вставлено в колонку жанра таблицы Film.

Поэтому, исходя из моего представления (которое может быть неэффективным, поскольку я не очень хорошо разбираюсь в SQL), мне нужно сначала вставить жанр Horror в таблицу Genre, как-то получить вновь созданный идентификатор, а затем вставить этот идентификатор в колонку genre вновь созданной записи Film. Когда я добавляю второй фильм Horror, идентификатор уже существует в таблице Genre, поэтому SQLite должен взять этот идентификатор и поместить его в новую запись Film для меня. Это возможно?

  • 0
    Два отрицательных голоса? Не могли бы вы объяснить, почему я могу улучшить вопрос?
  • 0
    Пожалуйста, покажите примеры для каждого случая.
Показать ещё 1 комментарий
Теги:
triggers
insert
primary-key

1 ответ

2
Лучший ответ

Невозможно передать строку 'Horror' в команду INSERT для таблицы Film, потому что в этой таблице нет такого столбца.

Во встроенной базе данных, такой как SQLite, нет хранимых процедур, потому что реализация логики в вашей собственной программе не будет менее эффективной.

Так что сделайте это сами; программа будет выглядеть так:

cursor = db.executeQuery('SELECT id FROM Genre WHERE name = ?', ['Horror'])
if cursor.hasSomeRecord:
    genreID = cursor['id']
else:
    db.executeCommand('INSERT INTO Genre(id, name) VALUES(NULL, ?)', ['Horror'])
    genreID = db.last_insert_rowid()

db.executeCommand('INSERT INTO Film(name, genre) VALUES(?, ?)', ['...', genreID])

Если у вас есть ограничение UNIQUE в поле " Genre(name), вы можете легко вставить жанр и автоматически избегать дубликатов:

INSERT OR IGNORE INTO Genre(name)
  VALUES('Horror');
INSERT INTO Film(name, genre)
  VALUES('...', (SELECT id FROM Genre WHERE name = 'Horror'));
  • 0
    Я не был уверен, был ли сохраненный подход для запуска с помощью триггеров, так как большинство примеров, которые я видел, ссылались на SQL Server / MySQL. Я думаю, что это должен быть ручной путь. Спасибо.
  • 0
    Да, у меня есть уникальное ограничение, поэтому этот метод выглядит лучше.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню