【问题标题】:Insert record then update another table插入记录然后更新另一个表
【发布时间】:2012-10-05 11:36:39
【问题描述】:

我正在努力思考如何有效地将数据插入到事先没有所有信息的表中。

我有两张桌子,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 作为流派。但是此时Genre表中没有Horror记录,所以Film表的genre列中没有可以插入的int值。

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

【问题讨论】:

  • 两张反对票?您能否解释一下原因,以便我改进问题?
  • 请给出每个案例的例子。
  • @CL。对不起,不清楚的问题。我不允许谈论我正在从事的项目,但希望我给出的例子可以解决问题。我仍然是 SQL 的初学者,所以我可能在这里遗漏了一些明显的方面。谢谢

标签: sql sqlite triggers insert primary-key


【解决方案1】:

无法将字符串'Horror' 传递到Film 表的INSERT 命令中,因为该表没有这样的列。

在像 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])

如果您在Genre(name) 字段上有UNIQUE 约束,您可以轻松插入流派,同时自动避免重复:

INSERT OR IGNORE INTO Genre(name)
  VALUES('Horror');
INSERT INTO Film(name, genre)
  VALUES('...', (SELECT id FROM Genre WHERE name = 'Horror'));

【讨论】:

  • 我不确定是否存在带有触发器的存储过程式方法,因为我看到的大多数示例都提到了 SQL Server/MySQL。我想它必须是手动方式。谢谢。
  • 是的,我确实有一个独特的约束,所以这种方法看起来更好。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-11-12
  • 1970-01-01
  • 1970-01-01
  • 2017-08-01
  • 1970-01-01
  • 2016-01-17
相关资源
最近更新 更多