sqlite 使用JOIN在一步中插入和选择

juzqafwq  于 2022-11-14  发布在  SQLite
关注(0)|答案(2)|浏览(147)

我正在使用SQLite3和Python3。我需要选择新插入的记录的主键值。主键是自动递增的,我更喜欢保持这种方式(而不是自己生成主键并在Python中跟踪它们)。我分两个步骤(SELECT之后的INSERT)完成此操作,但为了提高效率,我希望使用JOIN在一个步骤中完成。
Using cursor.lastrowid比两条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执行此操作,以便它仍然涉及单个execute,但严格限制为SQL命令?

ippsafx7

ippsafx71#

不可能在INSERT语句中执行联接。
如果要使用SQL命令,可以使用LAST_INSERT_ROWID SQL函数。但是,INSERT命令已经返回了相同的值,并且可以在Python中使用Cursor对象的lastrowid属性进行读取,或者在其他语言的数据库 Package 器中使用等效值。

of1yzvn4

of1yzvn42#

对我来说,它确实工作得不错。我要用在触发器里:

insert into tbl(currency)
select instrument.currency, price.lastprice 
from instrument
inner join price on price.instrument=instrument.symbol
where instrument.symbol=new.instrument
on conflict do nothing;

相关问题