-2

我试图围绕如何有效地将数据插入到事先没有所有信息的表中。

我有两张桌子,Table1Table2Table2的主键是一个自动递增的 int。此 int 用作行的 ID,并且也在列中Table1(不是唯一的,因此中的多条记录Table1可以具有相同的Table2.ID)。问题是,我如何插入一条新记录Table1以自动填充相关Table2.ID值?

我的逻辑是:

  1. 搜索Table2以查看记录是否存在。
  2. 如果存在,则返回 ID 值并在 Table1 中插入具有该 ID 值的新记录
  3. 如果不存在,则在Table2中插入新记录并返回ID
  4. 将新 ID 插入相关的 Table1 列

是否可以让 SQLite 自动插入相关 ID,而不是我必须在代码中执行此操作(四处阅读,我遇到过触发器,但不确定如何使用它们或者它们是否在这里有用)?

用示例更新问题(我不允许讨论我正在开发的实际游戏的各个方面,但这个虚构的示例具有相似的性质)

表 2 将被调用Genre,表 1 将被调用Film并且所有表都是空的。Genre PK (auto int) 将链接到Film表中的 Genre 列 (int)。该Film表没有varchar存储流派文本版本的列,只有 int 列。

我插入一条新记录并作为流派Film传入。Horror但是,此时表中没有Horror记录Genre,所以没有可以插入Film表的genre列的int值。

因此,从我的角度来看(可能效率不高,因为我不熟悉SQL),我需要先将Horror流派插入Genre表中,以某种方式获取新创建的ID,然后将该ID插入到genre新的列中创Film纪录。当我添加第二部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 回答