SQLite3 - 使用JOIN一步执行INSERT和SELECT

时间:2013-08-11 14:16:42

标签: join sqlite sql-insert

我正在使用SQLite3和Python 3.我当前的代码中有很多地方需要选择新插入记录的主键值。主键是自动增量的,我宁愿保持这种方式(而不是自己生成主键并在Python端跟踪它们。)

我在SELECT之后分两步执行此操作 - INSERT - 但我想知道是否有一种方法可以在一个步骤中使用JOIN来提高效率。

修改:有人向我指出,使用cursor.lastrowid的{​​{3}}已经有了一个解决方案,这确实比两个{{1}快得多}语句(下面的execute代码使用上面链接的解决方案中的示例):

timeit

任何人都可以说这是$ python -m timeit -s "\ > import sqlite3;\ > connection=sqlite3.connect(':memory:');\ > cursor=connection.cursor();\ > cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,\ > username varchar(50),\ > password varchar(50))''')" "\ > cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',\ > ('test','test'));\ > found = cursor.execute('''SELECT id FROM foo \ > WHERE username='test' \ > AND password='test' ''')" 100000 loops, best of 3: 10.1 usec per loop $ $ python -m timeit -s "\ > import sqlite3;\ > connection=sqlite3.connect(':memory:');\ > cursor=connection.cursor();\ > cursor.execute('''CREATE TABLE foo (id integer primary key autoincrement ,\ > username varchar(50),\ > password varchar(50))''')" "\ > cursor.execute('INSERT INTO foo (username,password) VALUES (?,?)',\ > ('test','test'));\ > found = cursor.lastrowid" 100000 loops, best of 3: 5.74 usec per loop $ 这样做的可能性,所以它仍然涉及单个JOIN,但严格限于SQL命令吗?

1 个答案:

答案 0 :(得分:1)

无法在INSERT语句中进行联接。

如果要使用SQL命令,可以使用last_insert_rowid SQL function。 但是,INSERT命令已经返回了相同的值,可以使用Python中的Cursor对象的lastrowid property或其他语言的数据库包装器中的等效值读取。