是否可以在SQLite数据库中一次插入多行?
在MySQL中,您可以插入多行,如下所示:
INSERT INTO 'tablename' ('column1', 'column2') VALUES('data1', 'data2'),('data1', 'data2'),('data1', 'data2'),('data1', 'data2');
但是,当我尝试做这样的事情时,我收到了一个错误。 是否可以在SQLite数据库中一次插入多行? 这样做的语法是什么?
#1楼
从版本3.7.11开始,SQLite确实支持多行插入。 理查德希普评论:
我正在使用3.6.13
我这样命令:
insert into xtable(f1,f2,f3) select v1 as f1, v2 as f2, v3 as f3
union select nextV1+, nextV2+, nextV3+
一次插入50条记录,只需一秒或更短时间。
使用sqlite一次插入多行是很有可能的。 由@Andy写道。
谢谢安迪+1
#2楼
Alex是正确的:“select ... union”语句将失去对某些用户非常重要的排序。 即使按特定顺序插入,sqlite也会更改内容,因此如果插入排序很重要,则更喜欢使用事务。
create table t_example (qid int not null, primary key (qid));
begin transaction;
insert into "t_example" (qid) values (8);
insert into "t_example" (qid) values (4);
insert into "t_example" (qid) values (9);
end transaction; select rowid,* from t_example;
1|8
2|4
3|9
#3楼
INSERT INTO TABLE_NAME (DATA1, DATA2)
VALUES (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2), (VAL1, VAL2);
#4楼
我有一个像下面这样的查询,但是使用ODBC驱动程序,SQLite的错误与“,”它说。 我在HTA(Html应用程序)中运行vbscript。
INSERT INTO evrak_ilac_iliskileri (evrak_id, ilac_id, baglayan_kullanici_id, tarih) VALUES (4150,762,1,datetime()),(4150,9770,1,datetime()),(4150,6609,1,datetime()),(4150,3628,1,datetime()),(4150,9422,1,datetime())
#5楼
fearless_fool对旧版本有很好的答案。 我只是想补充一点,你需要确保列出所有列。 因此,如果您有3列,则需要确保对3列进行选择操作。
示例:我有3列,但我只想插入2列数据。 假设我不关心第一列,因为它是标准的整数id。 我可以做以下......
INSERT INTO 'tablename'SELECT NULL AS 'column1', 'data1' AS 'column2', 'data2' AS 'column3'
UNION SELECT NULL, 'data3', 'data4'
UNION SELECT NULL, 'data5', 'data6'
UNION SELECT NULL, 'data7', 'data8'
注意:请记住“select ... union”语句将失去排序。 (来自AG1)
#6楼
在sqlite 3.7.2上:
INSERT INTO table_name (column1, column2) SELECT 'value1', 'value1' UNION SELECT 'value2', 'value2' UNION SELECT 'value3', 'value3'
等等
#7楼
是的,sql可以做到这一点,但使用不同的语法。 顺便说一句, sqlite文档非常好。 它还告诉您插入多行的唯一方法是使用select语句作为要插入的数据的源。
#8楼
是的,从SQLite 3.7.11开始 ,SQLite支持这一点。 从SQLite文档 :
(当这个答案最初编写时,不支持)
为了与旧版本的SQLite兼容,您可以使用andy和fearless_fool使用UNION
建议的技巧,但对于3.7.11及更高版本,此处描述的更简单的语法应该是首选。
#9楼
根据此页面 ,不支持:
- 2007-12-03:不支持多行INSERT又名复合INSERT。
INSERT INTO table (col1, col2) VALUES ('row1col1', 'row1col2'), ('row2col1', 'row2col2'), ...
实际上,根据SQL92标准,VALUES表达式应该能够独立存在。 例如,以下内容应该返回一个包含三行的单列表:
VALUES 'john', 'mary', 'paul';
从版本3.7.11开始,SQLite 确实支持多行插入 。 理查德希普评论:
“新的多值插入物仅仅是复合插入物的语法特征(sic)。没有任何性能优势。”
#10楼
除了通过SELECT,Sqlite3不能直接在SQL中执行此操作,而SELECT可以返回表达式的“行”,我知道无法使其返回虚假列。
但是,CLI可以这样做:
.import FILE TABLE Import data from FILE into TABLE
.separator STRING Change separator used by output mode and .import$ sqlite3 /tmp/test.db
SQLite version 3.5.9
Enter ".help" for instructions
sqlite> create table abc (a);
sqlite> .import /dev/tty abc
1
2
3
99
^D
sqlite> select * from abc;
1
2
3
99
sqlite>
如果您确实在INSERT周围放置一个循环,而不是使用CLI .import
命令,那么请务必遵循sqlite FAQ中关于INSERT速度的建议:
默认情况下,每个INSERT语句都是自己的事务。 但是如果用BEGIN ... COMMIT包围多个INSERT语句,则所有插入都被分组到一个事务中。 提交事务所需的时间在所有随附的insert语句中分摊,因此每个insert语句的时间大大减少。
另一种选择是运行PRAGMA synchronous = OFF。 此命令将导致SQLite不等待数据到达磁盘表面,这将使写入操作看起来更快。 但是,如果在事务中间断电,则数据库文件可能会损坏。
#11楼
我能够使查询动态化。 这是我的表:
CREATE TABLE "tblPlanner" ("probid" text,"userid" TEXT,"selectedtime" DATETIME,"plannerid" TEXT,"isLocal" BOOL,"applicationid" TEXT, "comment" TEXT, "subject" TEXT)
我通过JSON
获取所有数据,所以在将所有内容都放入NSArray
我遵循了以下内容:
NSMutableString *query = [[NSMutableString alloc]init];for (int i = 0; i < arr.count; i++){NSString *sqlQuery = nil;sqlQuery = [NSString stringWithFormat:@" ('%@', '%@', '%@', '%@', '%@', '%@', '%@', '%@'),",[[arr objectAtIndex:i] objectForKey:@"plannerid"],[[arr objectAtIndex:i] objectForKey:@"probid"],[[arr objectAtIndex:i] objectForKey:@"userid"],[[arr objectAtIndex:i] objectForKey:@"selectedtime"],[[arr objectAtIndex:i] objectForKey:@"isLocal"],[[arr objectAtIndex:i] objectForKey:@"subject"],[[arr objectAtIndex:i] objectForKey:@"comment"],[[NSUserDefaults standardUserDefaults] objectForKey:@"applicationid"]];[query appendString:sqlQuery];}// REMOVING LAST COMMA NOW[query deleteCharactersInRange:NSMakeRange([query length]-1, 1)];query = [NSString stringWithFormat:@"insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values%@",query];
最后输出查询是这样的:
insert into tblPlanner (plannerid, probid, userid, selectedtime, isLocal, applicationid, subject, comment) values
<append 1>
('pl1176428260', '', 'US32552', '2013-06-08 12:00:44 +0000', '0', 'subj', 'Hiss', 'ap19788'),
<append 2>
('pl2050411638', '', 'US32552', '2013-05-20 10:45:55 +0000', '0', 'TERI', 'Yahoooooooooo', 'ap19788'),
<append 3>
('pl1828600651', '', 'US32552', '2013-05-21 11:33:33 +0000', '0', 'test', 'Yest', 'ap19788'),
<append 4>
('pl549085534', '', 'US32552', '2013-05-19 11:45:04 +0000', '0', 'subj', 'Comment', 'ap19788'),
<append 5>
('pl665538927', '', 'US32552', '2013-05-29 11:45:41 +0000', '0', 'subj', '1234567890', 'ap19788'),
<append 6>
('pl1969438050', '', 'US32552', '2013-06-01 12:00:18 +0000', '0', 'subj', 'Cmt', 'ap19788'),
<append 7>
('pl672204050', '', 'US55240280', '2013-05-23 12:15:58 +0000', '0', 'aassdd', 'Cmt', 'ap19788'),
<append 8>
('pl1019026150', '', 'US32552', '2013-06-08 12:15:54 +0000', '0', 'exists', 'Cmt', 'ap19788'),
<append 9>
('pl790670523', '', 'US55240280', '2013-05-26 12:30:21 +0000', '0', 'qwerty', 'Cmt', 'ap19788')
通过代码运行良好,我能够成功地保存SQLite中的所有内容。
在此之前,我使UNION
查询的东西动态,但开始给出一些语法错误。 无论如何,这对我来说运行良好。
#12楼
从版本2012-03-20(3.7.11)开始,sqlite支持以下INSERT语法:
INSERT INTO 'tablename' ('column1', 'column2') VALUES('data1', 'data2'),('data3', 'data4'),('data5', 'data6'),('data7', 'data8');
阅读文档: http : //www.sqlite.org/lang_insert.html
PS:请给Brian Campbell回复/回答+1。 不是我的! 他首先提出了解决方案。
#13楼
是的,但是没有通常的逗号分隔插入值。
尝试这个...
insert into myTable (col1,col2) select aValue as col1,anotherValue as col2 union select moreValue,evenMoreValue union...
是的,它有点丑陋,但很容易从一组值自动生成语句。 此外,您似乎只需要在第一个选择中声明列名称。
#14楼
正如其他海报所说,SQLite不支持这种语法。 我不知道复合INSERT是否是SQL标准的一部分,但根据我的经验,它们并未在许多产品中实现。
顺便说一句,您应该知道,如果在显式事务中包装多个INSERT,SQLite中的INSERT性能会得到显着提高。
#15楼
你不能但我不认为你错过任何东西。
因为你总是在调用sqlite,所以无论你执行1个insert语句还是100个insert语句,性能几乎都无关紧要。 然而,提交需要花费大量时间,因此将这100个插入内容放入事务中。
使用参数化查询时,Sqlite要快得多(所需的解析要少得多),所以我不会连接像这样的大语句:
insert into mytable (col1, col2)
select 'a','b'
union
select 'c','d'
union ...
它们需要一次又一次地进行解析,因为每个连接语句都是不同的。
#16楼
你可以使用InsertHelper,它简单快捷
文档: http : //developer.android.com/reference/android/database/DatabaseUtils.InsertHelper.html
教程: http : //www.outofwhatbox.com/blog/2010/12/android-using-databaseutils-inserthelper-for-faster-insertions-into-sqlite-database/
编辑:从API级别17开始,不推荐使用InsertHelper
#17楼
如果您使用 Sqlite管理器 firefox插件,它支持 INSERT
SQL语句的批量插入。
事实上,它不支持这一点,但Sqlite浏览器支持(适用于Windows,OS X,Linux)
#18楼
我很惊讶没有人提到准备好的陈述 。 除非你自己使用SQL而不是任何其他语言,否则我认为包装在事务中的预处理语句将是插入多行的最有效方式。
#19楼
如果您使用的是bash shell,可以使用:
time bash -c $'
FILE=/dev/shm/test.db
sqlite3 $FILE "create table if not exists tab(id int);"
sqlite3 $FILE "insert into tab values (1),(2)"
for i in 1 2 3 4; do sqlite3 $FILE "INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5"; done;
sqlite3 $FILE "select count(*) from tab;"'
或者,如果您使用的是sqlite CLI,则需要执行以下操作:
create table if not exists tab(id int);"
insert into tab values (1),(2);
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
INSERT INTO tab (id) select (a.id+b.id+c.id)*abs(random()%1e7) from tab a, tab b, tab c limit 5e5;
select count(*) from tab;
它是如何工作的? 它使用了表格tab
:
id int
------
1
2
然后select a.id, b.id from tab a, tab b
返回
a.id int | b.id int
------------------1 | 12 | 11 | 22 | 2
等等。 首次执行后,我们插入2行,然后2 ^ 3 = 8。 (三,因为我们有tab a, tab b, tab c
)
在第二次执行后,我们插入额外的(2+8)^3=1000
行
在aftern thrid我们插入大约max(1000^3, 5e5)=500000
行等等......
这是我最熟悉的填充SQLite数据库的方法。
#20楼
在mysql lite中你不能插入多个值,但是你可以通过只打开一次连接然后执行所有插入然后关闭连接来节省时间。 它节省了大量时间
#21楼
更新
正如BrianCampbell在此指出的那样 , SQLite 3.7.11及更高版本现在支持原始帖子的更简单的语法 。 但是,如果要在旧数据库中实现最大兼容性,则显示的方法仍然适用。
原始答案
如果我有权限,我会碰到andy的回复 :你可以在SQLite中插入多行,你只需要不同的语法 。 为了使它完全清楚,OPs MySQL示例:
INSERT INTO 'tablename' ('column1', 'column2') VALUES('data1', 'data2'),('data1', 'data2'),('data1', 'data2'),('data1', 'data2');
这可以重新编写为SQLite:
INSERT INTO 'tablename'SELECT 'data1' AS 'column1', 'data2' AS 'column2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
UNION ALL SELECT 'data1', 'data2'
关于表现的说明
我最初使用这种技术从Ruby on Rails高效加载大型数据集。 但是 , 正如Jaime Cook指出的那样 ,目前尚不清楚这是否会在单个事务中更快地包装单个INSERTs
:
BEGIN TRANSACTION;
INSERT INTO 'tablename' table VALUES ('data1', 'data2');
INSERT INTO 'tablename' table VALUES ('data3', 'data4');
...
COMMIT;
如果效率是你的目标,你应该先尝试一下。
关于UNION vs UNION ALL的说明
正如一些人评论的那样,如果你使用UNION ALL
(如上所示),将插入所有行,因此在这种情况下,你将获得四行data1, data2
。 如果省略ALL
,则将删除重复的行(并且操作可能会慢一点)。 我们正在使用UNION ALL,因为它更接近原始帖子的语义。
结束
PS:请+1和我的回复 ,不是我的! 他首先提出了解决方案。
#22楼
我编写了一些ruby代码,用于从一系列插入语句生成单个500元素的多行插入,这比运行单个插入要快得多。 然后我尝试简单地将多个插入包装到一个事务中,发现我可以用相当少的代码获得相同的加速。
BEGIN TRANSACTION;
INSERT INTO table VALUES (1,1,1,1);
INSERT INTO table VALUES (2,2,2,2);
...
COMMIT;
#23楼
使用事务的问题是您还要锁定表以进行读取。 因此,如果您要插入大量数据并且需要访问数据,例如预览左右,这种方式效果不佳。
另一种解决方案的问题是你丢失了插入的顺序
insert into mytable (col)
select 'c'
union
select 'd'
union
select 'a'
union
select 'b';
在sqlite中,数据将存储a,b,c,d ......
#24楼
INSERT INTO tabela(coluna1,coluna2)
SELECT 'texto','outro'
UNION ALL
SELECT 'mais texto','novo texto';
是否可以在SQLite数据库中一次插入多行?相关推荐
- 在SQLite数据库中获取新插入数据自增长的ID值
SQLiteDatabase db = helper.getWritableDatabase(); db.execSQL("insert into person(name,phone,am ...
- Sql Server数据库数据导入到SQLite数据库中
背景:Sql Serve数据库中有个表格A,想把数据导入到SQLite数据库中 工具下载地址:点击打开链接 用法: 原作者地址及下载地址:点击打开链接
- android sqlite更改数据,更新现有的sqlite数据库中的列,但没有任何更改android
对不起,但我没有在网上找到任何东西.我在我的目录"资产"中使用现有的数据库.当我想更新一列时,函数返回该列已经改变,但实际上并没有发生.我试着用execSQL,但没有再次.更新现有 ...
- qt mysql 系统时间_使用QT和参数在SQLite数据库中插入日期时间
我想从C++/QT应用程序执行插入到SQLite数据库. 我想要插入数据的表格中的一列是datetime(yyyy-mm-dd hh:mm:ss).使用QT和参数在SQLite数据库中插入日期时间 我 ...
- sqlite数据库中的sql语句大全-zhuan
转载自http://hunankeda110.iteye.com/blog/1143258 2010年SQLite学习笔记之一 一. 如何获取SQLite最新版本 官方站点:http://www.sq ...
- c语言sqlite3写数据类型,在sqlite数据库中,int类型不等于integer数据类型
在sqlite数据库中,int类型不等于integer数据类型 这些天一直在忙销售管理软件易卖通客户端的程序编写,由于需要采用本地数据缓存机制来提高程序的数据访问效率,所以需要在客户端使用一个小巧的本 ...
- Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容
Android studio根据文本提取出的关键词在sqlite数据库中查找相关内容 一.介绍 二.Android studio连接.操作和查看sqlite数据库 三.在数据库中查找相关内容 四.运行 ...
- python金融数据分析和可视化--02_04将股票数据存到sqlite数据库中
02_04将股票数据存到sqlite数据库中 1. 建立连接 通过SQLAlchemy中的create_engine()函数连接数据库 from sqlalchemy import create_en ...
- android sqlite删除表中所有数据,对于Sqlite,删除Sqlite数据库中的所有表,删除sqlite数据库...
对于Sqlite,删除Sqlite数据库中的所有表,删除sqlite数据库 SQLite数据库中一个特殊的名叫SQLITE_MASTER上执行一个SELECT查询以获得所有表的索引.每一个SQLite ...
最新文章
- pycharm远程调试或运行代码
- 使用WINS服务器实现跨网段名称注册解析和释放
- 读”SQL Injection Pocket Reference”之摘录
- “对技术没有好奇心”真的是很失败的一件事情
- 【Kubernetes】 configmaps is forbidden User system:anonymous cannot list resource configmaps
- 钉钉自带浏览器版本过低,导致Object.assign不兼容...
- Dockerfile创建pytorch1.1.0+cuda10.0+cudnn7.5踩过的坑
- Echarts数据可视化全解
- 开课吧Java课堂:特殊的字符串如何操作,字符串如何连接
- RV减速器动力学模型静力学matlab程序代码
- 软件工程期末考试试题及答案(详细、经典)
- Chinaitlab技术及认证专题大全[第二辑] 09年8月03日更新
- 元气骑士双人远程联机指南
- Technorati的后台数据库架构
- 微信小程序云开发之云函数与本地数据库获取数据
- 比Office365、WPS更好用的最新版OpenOffice
- 深入理解 Linux 内存子系统
- 关于“运放“这些知识点
- 试题 算法训练 kAc给糖果你吃(贪心)
- 路飞学城之 luffy(1)