插入记录然后更新另一个表

时间:2012-10-05 11:36:40

标签: sql sqlite triggers insert primary-key

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

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

我的逻辑是:

  1. 搜索Table2以查看记录是否存在。
  2. 如果存在,则返回ID值并在Table1中插入具有该ID值
  3. 的新记录
  4. 如果它不存在,请在表2中插入新记录并返回ID
  5. 将新ID插入相关的Table1列
  6. 是否有可能让SQLite自动插入相关ID,而不是我必须在代码中执行此操作(阅读,我遇到了触发器,但不知道如何使用它们或者它们在这里是否有用) ?

    使用示例更新了问题(我不允许讨论我正在处理的实际游戏的各个方面,但这个组成的示例具有相似的性质)

    表2将被称为Genre,表1将被称为Film,所有表都是空的。 Genre PK(auto int)将链接到Film表中的Genre列(int)。 Film表没有varchar列来存储类型的文本版本,只有int列。

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

    因此,从我的观点来看(由于我不熟悉SQL可能效率低下),我需要先将Horror类型插入到Genre表中,然后以某种方式获取新创建的ID,然后将该ID插入新创建的genre记录的Film列中。当我添加第二部Horror电影时,该ID已存在于Genre表格中,因此SQLite应该将该ID用于我,并将其放入新的Film记录中。这可能吗?

1 个答案:

答案 0 :(得分: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'));