-2

事前にすべての情報がないテーブルにデータを効率的に挿入する方法に頭を悩ませようとしています。

2つのテーブルがTable1ありTable2ます。Table2の主キーは自動インクリメントintです。このintは行のIDとして機能し、の列にもありますTable1(一意ではないため、の複数のレコードがTable1同じになる可能性があります)。問題は、関連する値を自動的Table2.IDに入力する新しいレコードを挿入する方法です。?Table1Table2.ID

私の論理は次のとおりです。

  1. Table2レコードが存在するかどうかを検索します。
  2. 存在する場合は、ID値を返し、そのID値を使用してTable1に新しいレコードを挿入します
  3. 存在しない場合は、Table2に新しいレコードを挿入し、IDを返します
  4. 関連するTable1列に新しいIDを挿入します

コードでそれを行うのではなく、SQLiteに関連するIDの挿入を自動化させることは可能ですか(読んで、トリガーに出くわしましたが、それらの使用方法やここで役立つかどうかはわかりません)?

例を使用して質問を更新しました(私が取り組んでいる実際のゲームの側面について説明することは許可されていませんが、この構成された例は同様の性質のものです)

テーブル2が呼び出されGenre、テーブル1が呼び出されFilm、すべてのテーブルが空になります。ジャンルPK(auto int)は、テーブルのジャンル列(int)にリンクされFilmます。Filmテーブルには、ジャンルのテキストバージョンを格納する列はなく、varcharint列のみがあります。

Film新しいレコードを挿入Horrorし、ジャンルとして渡します。ただし、現時点でHorrorはテーブルにレコードがないGenreため、テーブルのジャンル列に挿入できるint値はありませんFilm

したがって、私の見解では(SQLに精通していないため非効率的かもしれません)、最初にHorrorジャンルをGenreテーブルに挿入し、何らかの方法で新しく作成されたIDを取得してから、そのIDを新しく作成されたgenre列に挿入する必要があります。Filmレコードを作成しました。2つ目のフィルムを追加するHorrorと、IDはすでにGenreテーブルに存在するため、SQLiteはそのIDを取得して、新しいFilmレコードに配置する必要があります。それは可能ですか?

4

1 に答える 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'));
于 2012-10-05T12:33:07.887 に答える