无法通过.mode insert结合.read将查询结果直接导入SQLite目标表
问题
在SQLite命令行中,我可以用.read执行Query.sql得到结果集,也能通过.output csv把结果导出成.csv再导入TargetTable。但我想直接把.sql文件的结果集导入表,于是用了以下命令:
.mode insert TargetTable .read Query.sql
这些命令生成了有效的INSERT INTO语句,但TargetTable根本没更新。可要是把这些语句复制粘贴到SQLite命令行(不管单独还是批量执行),TargetTable就能正常更新。这到底哪里错了?
相关信息
- Query.sql内容:
Select * from TbFiles
- TEST.SQLITE的表结构:
CREATE TABLE "TbFiles" ( "FileName" TEXT NOT NULL UNIQUE, "FileSize" INTEGER ) CREATE TABLE "TargetTable" ( "FileName" TEXT NOT NULL UNIQUE, "FileSize" INTEGER )
- 初始化操作(在sqlite3命令行执行):
sqlite3 TEST.SQLITE INSERT INTO TbFiles VALUES('Black',10); INSERT INTO TbFiles VALUES('Brown',11); INSERT INTO TbFiles VALUES('Red',1); INSERT INTO TbFiles VALUES('Bue',2); INSERT INTO TbFiles VALUES('Green',3); INSERT INTO TbFiles VALUES('Yellow',4);
- 尝试执行的命令:
.separator , .mode insert TargetTable .read Query.sql
- SQLite返回的语句:
INSERT INTO TargetTable VALUES('Black',10); INSERT INTO TargetTable VALUES('Brown',11); INSERT INTO TargetTable VALUES('Red',1); INSERT INTO TargetTable VALUES('Bue',2); INSERT INTO TargetTable VALUES('Green',3); INSERT INTO TargetTable VALUES('Yellow',4);
解决方法
问题出在.mode insert的作用上——这个模式只是把查询结果格式化成INSERT语句的输出形式,并不会自动执行这些INSERT语句。它本质是用来生成SQL代码,而非直接执行插入操作。
要实现直接把查询结果导入目标表,有两种更高效的方式:
方式一:用INSERT...SELECT语句直接插入
不用绕弯子生成INSERT语句,直接在SQL里写:
INSERT INTO TargetTable SELECT * FROM TbFiles;
如果要通过文件执行,把这条语句写到Query.sql里,再用.read Query.sql执行即可。
方式二:生成语句后再执行(适配原思路)
如果一定要用.mode insert生成语句再执行,需要把输出定向到临时文件,再读取这个文件执行:
.mode insert TargetTable .output temp_inserts.sql .read Query.sql .output stdout .read temp_inserts.sql
这样生成的INSERT语句会被写入temp_inserts.sql,读取执行后就能更新TargetTable了。
内容的提问来源于stack exchange,提问作者JAH1
相关产品推荐
相关产品推荐

