Я пытаюсь обернуть голову тем, как эффективно вставлять данные в таблицу, которая не имеет всей информации заранее.
У меня есть две таблицы: Table1
и Table2
. Первым ключом Table2
является автоинкремент int. Этот int служит идентификатором для строки и также находится в столбце в Table1
(не уникален, поэтому несколько записей в Table1
могут иметь один и тот же Table2.ID
). Проблема заключается в том, как добавить новую запись в Table1
, автоматически заполняет соответствующее значение Table2.ID
?
Моя логика:
Table2
чтобы узнать, существует ли запись.Возможно ли, что 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
для меня. Это возможно?
Невозможно передать строку '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'));