SQLite3中INSERT语句复用嵌套SELECT多列的优化方法
在SQLite3中优化INSERT子查询重复执行及复制行修改列的方法
一、避免子查询重复执行的INSERT写法
如果你的原写法是类似这样(子查询被重复调用两次):
INSERT INTO table_a (col1, col2) VALUES ( (SELECT val1 FROM complex_subquery), (SELECT val2 FROM complex_subquery) );
这种写法会导致子查询执行两次,复杂场景下性能很差。可以用两种方式优化:
1. 使用CTE(WITH子句)封装子查询
CTE在SQLite中会被计算一次,然后复用结果:
WITH sub AS ( SELECT val1, val2 FROM complex_subquery ) INSERT INTO table_a (col1, col2) SELECT val1, val2 FROM sub;
用EXPLAIN QUERY PLAN查看会发现子查询只执行一次,性能明显提升。
2. 将子查询放在FROM子句中
如果不想用CTE,也可以直接把子查询作为数据源:
INSERT INTO table_a (col1, col2) SELECT s.val1, s.val2 FROM (SELECT val1, val2 FROM complex_subquery) s;
这种写法同样只会执行一次子查询,效果和CTE一致。
二、复制现有行并修改部分列的简便写法
要复制表中某一行,只修改部分列,直接用INSERT ... SELECT语法即可,不需要手动写所有列的原值:
示例场景
假设table_a有列id(自增)、name、age、status,要复制id=10的行,修改name为"NewName",status为1:
INSERT INTO table_a (name, age, status) SELECT "NewName", age, 1 FROM table_a WHERE id = 10;
如果表的列很多,不想逐个列写,可以利用SQLite的默认值特性(如果列允许默认值),或者显式列出所有需要保留的列和要修改的列。
注意:如果有自增主键(比如id INTEGER PRIMARY KEY AUTOINCREMENT),INSERT时不要包含该列,SQLite会自动生成新的主键值。
内容的提问来源于stack exchange,提问作者BestCrazyNoob
相关产品推荐
相关产品推荐

