我正试图围绕如何有效地将数据插入到事先没有所有信息的表中。
我有两个表,Table1
和Table2
。 Table2
的主键是自动增量int。此int用作行的ID,也位于Table1
的列中(不唯一,因此Table1
中的多个记录可以具有相同的Table2.ID
)。问题是,如何在Table1
中插入自动填写相关Table2.ID
值的新记录?
我的逻辑是:
Table2
以查看记录是否存在。 是否有可能让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
记录中。这可能吗?
答案 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'));