sqlite插入sqlite查询不重复数据的数据,如何实现 特殊

Sqlite 防止插入重复数据
Sqlite 防止插入重复数据
发布时间: 18:26:08
编辑:www.fx114.net
本篇文章主要介绍了"Sqlite 防止插入重复数据",主要涉及到Sqlite 防止插入重复数据方面的内容,对于Sqlite 防止插入重复数据感兴趣的同学可以参考一下。
在SQLITE中,可以用以下方法防止插入重复数据,
1.设置表的联合主键
2.在INSERT语句中添加OR IGNORE,即可(重复数据会跳过,且不影响后续数据插入)
示例如下:
insert OR IGNORE into PDA_Test (DeviceID,MethodName) values('1112','测试原有');
sqlite避免重复插入数据。
SQLite 数据库常用约束如下:
NOT NULL - 非空
UNIQUE - 唯一
PRIMARY KEY - 主键
FOREIGN KEY - 外键
CHECK - 条件检查
DEFAULT - 默认
用insert语句插入数据,为避免重复插入又不打断数据处理。
首先要避免重复插入,就必须在插入时引发冲突。在表中设置了id字段,该字段为UNIQUE属性,当插入的id已存在时引发冲突。
引发冲突后insert会做一些处理,处理方式由OR字句定义。包含如下:
ROLLBACK当发生约束冲突,立即ROLLBACK,即结束当前事务处理,命令中止并返回SQLITE_CONSTRAINT代码。若当前无活动事务(除了每一条命令创建的默认事务以外),则该算法与ABORT相同。
ABORT当发生约束冲突,命令收回已经引起的改变并中止返回SQLITE_CONSTRAINT。但由于不执行ROLLBACK,所以前面的命令产生的改变将予以保留。缺省采用这一行为。
FAIL当发生约束冲突,命令中止返回SQLITE_CONSTRAINT。但遇到冲突之前的所有改变将被保留。例如,若一条UPDATE语句在100行遇到冲突100th,前99行的改变将被保留,而对100行或以后的改变将不会发生。
IGNORE当发生约束冲突,发生冲突的行将不会被插入或改变。但命令将照常执行。在冲突行之前或之后的行将被正常的插入和改变,且不返回错误信息。
REPLACE当发生UNIQUE约束冲突,先存在的,导致冲突的行在更改或插入发生冲突的行之前被删除。这样,更改和插入总是被执行。命令照常执行且不返回错误信息。当发生NOT NULL约束冲突,导致冲突的NULL值会被字段缺省值取代。若字段无缺省值,执行ABORT算法
为避免操作打断,我选择了IGNORE。最后完整的用法如下:
INSERT OR IGNORE INTO troopstypes (id)values(2);
以代码为例
import win.
mainForm = ..win.form( bottom=282;parent=...;right=600;text=&AAuto Form& )
mainForm.add(
button2={ bottom=260;text=&删除选中&;left=380;top=237;z=5;right=452;cls=&button& };
listview={ bgcolor=;bottom=273;right=368;left=5;cls=&listview&;top=6;z=1;gridLines=1;edge=1;fullRow=1 };
edit={ bottom=37;text=&edit&;left=381;multiline=1;top=7;z=2;right=592;edge=1;cls=&edit& };
button={ bottom=106;right=591;left=522;top=84;z=3;text=&添加&;cls=&button& };
edit2={ bottom=74;text=&edit2&;left=381;multiline=1;top=44;z=4;right=593;edge=1;cls=&edit& }
mainForm.button2.oncommand = function(id,event){
mainForm.listview.insertColumn(&编号&,40,1)
mainForm.listview.insertColumn(&帐号&,100,2)
mainForm.listview.insertColumn(&密码&,100,3)
mainForm.button.oncommand = function(id,event){
开启=function(){
& sqlConnection = sqlite(&C:\Users\Administrator\Desktop\db1.db&)
not sqlConnection.existsTable(&jsyou&) ){
&&&&&&& sqlConnection.exec( &create table jsyou(id INTEGER PRIMARY KEY AUTOINCREMENT,name,password);&)
读取=function(){
& mainForm.listview.clear()
&&& for(k,name,passwordin sqlConnection.each(&select * from jsyou&)
&&&&&&& cou=mainForm.listview.count+1
&&&&&&& mainForm.listview.addItem();
&&&&&&& mainForm.listview.setItemText(tostring(k),cou,1);
&&&&&&& mainForm.listview.setItemText(name,cou,2);
&&&&&&& mainForm.listview.setItemText(password,cou,3);
& sqlConnection.close();&&&
插入=function(){
&&& var count=mainForm.listview.
&&& var name=mainForm.edit.
&&& var password=mainForm.edit2.text
&&& mainForm.listview.addItem({
&&&&&&& tostring(count+1);
&&&&&&& password
&&& 开启()
&&& sqlConnection.exec( &insertOR IGNORE into jsyou(name,password) values ('&++name++&', '&++password++&');&)
&&& sqlConnection.close();
删除=function(){
& shu = mainForm.listview.getItemText(mainForm.listview.selIndex,1)
& sqlConnection.exec( &DELETE FROM jsyou WHERE id= '&++shu++&' &)
& mainForm.listview.delItem(mainForm.listview.selIndex)
& sqlConnection.close();
mainForm.show()
win.loopMessage();
一、不得利用本站危害国家安全、泄露国家秘密,不得侵犯国家社会集体的和公民的合法权益,不得利用本站制作、复制和传播不法有害信息!
二、互相尊重,对自己的言论和行为负责。
本文标题:
本页链接:6041人阅读
数据库(3)
在SQLITE中,可以用以下方法防止插入重复数据,
1.设置表的联合主键
2.在INSERT语句中添加OR IGNORE,即可(重复数据会跳过,且不影响后续数据插入)
示例如下:
insert OR IGNORE into PDA_Test (DeviceID,MethodName) values('1112','测试原有');
sqlite避免重复插入数据。
SQLite 数据库常用约束如下:
NOT NULL - 非空
UNIQUE - 唯一
PRIMARY KEY - 主键
FOREIGN KEY - 外键
CHECK - 条件检查
DEFAULT - 默认
用insert语句插入数据,为避免重复插入又不打断数据处理。
首先要避免重复插入,就必须在插入时引发冲突。在表中设置了id字段,该字段为UNIQUE属性,当插入的id已存在时引发冲突。
引发冲突后insert会做一些处理,处理方式由OR字句定义。包含如下:
ROLLBACK当发生约束冲突,立即ROLLBACK,即结束当前事务处理,命令中止并返回SQLITE_CONSTRAINT代码。若当前无活动事务(除了每一条命令创建的默认事务以外),则该算法与ABORT相同。
ABORT当发生约束冲突,命令收回已经引起的改变并中止返回SQLITE_CONSTRAINT。但由于不执行ROLLBACK,所以前面的命令产生的改变将予以保留。缺省采用这一行为。
FAIL当发生约束冲突,命令中止返回SQLITE_CONSTRAINT。但遇到冲突之前的所有改变将被保留。例如,若一条UPDATE语句在100行遇到冲突100th,前99行的改变将被保留,而对100行或以后的改变将不会发生。
IGNORE当发生约束冲突,发生冲突的行将不会被插入或改变。但命令将照常执行。在冲突行之前或之后的行将被正常的插入和改变,且不返回错误信息。
REPLACE当发生UNIQUE约束冲突,先存在的,导致冲突的行在更改或插入发生冲突的行之前被删除。这样,更改和插入总是被执行。命令照常执行且不返回错误信息。当发生NOT NULL约束冲突,导致冲突的NULL值会被字段缺省值取代。若字段无缺省值,执行ABORT算法
为避免操作打断,我选择了IGNORE。最后完整的用法如下:
INSERT OR IGNORE INTO troopstypes (id)values(2);
以代码为例
import win.
mainForm = ..win.form( bottom=282;parent=...;right=600;text=&AAuto Form& )
mainForm.add(
button2={ bottom=260;text=&删除选中&;left=380;top=237;z=5;right=452;cls=&button& };
listview={ bgcolor=;bottom=273;right=368;left=5;cls=&listview&;top=6;z=1;gridLines=1;edge=1;fullRow=1 };
edit={ bottom=37;text=&edit&;left=381;multiline=1;top=7;z=2;right=592;edge=1;cls=&edit& };
button={ bottom=106;right=591;left=522;top=84;z=3;text=&添加&;cls=&button& };
edit2={ bottom=74;text=&edit2&;left=381;multiline=1;top=44;z=4;right=593;edge=1;cls=&edit& }
mainForm.button2.oncommand = function(id,event){
mainForm.listview.insertColumn(&编号&,40,1)
mainForm.listview.insertColumn(&帐号&,100,2)
mainForm.listview.insertColumn(&密码&,100,3)
mainForm.button.oncommand = function(id,event){
开启=function(){
& sqlConnection = sqlite(&C:\Users\Administrator\Desktop\db1.db&)
not sqlConnection.existsTable(&jsyou&) ){
&&&&&&& sqlConnection.exec( &create table jsyou(id INTEGER PRIMARY KEY AUTOINCREMENT,name,password);&)
读取=function(){
& mainForm.listview.clear()
&&& for(k,name,passwordin sqlConnection.each(&select * from jsyou&)
&&&&&&& cou=mainForm.listview.count+1
&&&&&&& mainForm.listview.addItem();
&&&&&&& mainForm.listview.setItemText(tostring(k),cou,1);
&&&&&&& mainForm.listview.setItemText(name,cou,2);
&&&&&&& mainForm.listview.setItemText(password,cou,3);
& sqlConnection.close();&&&
插入=function(){
&&& var count=mainForm.listview.
&&& var name=mainForm.edit.
&&& var password=mainForm.edit2.text
&&& mainForm.listview.addItem({
&&&&&&& tostring(count+1);
&&&&&&& password
&&& 开启()
&&& sqlConnection.exec( &insertOR IGNORE into jsyou(name,password) values ('&++name++&', '&++password++&');&)
&&& sqlConnection.close();
删除=function(){
& shu = mainForm.listview.getItemText(mainForm.listview.selIndex,1)
& sqlConnection.exec( &DELETE FROM jsyou WHERE id= '&++shu++&' &)
& mainForm.listview.delItem(mainForm.listview.selIndex)
& sqlConnection.close();
mainForm.show()
win.loopMessage();
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:9998次
排名:千里之外
(1)(1)(1)(3)(2)(1)(1)(1)3089人阅读
Mysql(20)
一直以来在使用SQL语句的时候都是力求简洁,把SQL精简到最优化以提高效率。这是做Web程序时养成的习惯。不过,最近在一个c#程序中使用到嵌入式数据库SQLite,让我对SQL语句的要求更提高了一步。例如,在向数据库中插入新行时,如果违背了某一唯一性约束。那么整个更新过程就会失败。更要命的是如果同时插入1000条、10000条甚至更多条数据的时候,如果仅仅因为某条数据出错,导致整个过程rollback了,似乎在性能上就得不偿失了。
起初我想了一个比较笨的办法,聪明的你可能已经想到了^_^,先用select语句查询是否存在重复,剔除到重复后在插入新数据。对于大批量数据的插入/更新,这的的确确是个笨办法。
后来想到用触发器做这个,效果不错,但为这么个简单的问题就动用触发器似乎也不合理喔。最后在查询手册的过程发现了一条语句可以很好地解决重复问题。
CONFLICT&conflict-algorithm
conflict-algorithm::=
ROLLBACK&|&ABORT&|&FAIL&|&IGNORE&|&REPLACE
这个是用在新建数据表的时候,如果是在插入或更新语句中使用就可以使用 OR 代替 ON Conflict。
例如: insert or ignore into table (fields) values (values);
或者干脆使用 replace into table (fields) values (values);
replace = insert or replace
很好地解决了更新/插入重复的问题^_^
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1119122次
积分:11878
积分:11878
排名:第1041名
原创:160篇
转载:251篇
评论:103条
(1)(1)(2)(2)(12)(3)(1)(7)(12)(13)(9)(24)(22)(5)(12)(11)(2)(5)(4)(9)(2)(2)(2)(10)(7)(15)(2)(9)(26)(9)(4)(18)(8)(19)(12)(9)(19)(13)(16)(30)(15)(19)(4)27410人阅读
android(226)
Android开发中我们常会遇到这样一种情况:在建立一个SQLite数据库时,想同时插入大量数据。那么应该怎么做呢?
下面笔者以插入20条记录为例:
&&将同时插入大量的数据写成一条SQL语句
&最笨的方法用insert语句一条一条的输入
代码如下:
public class DateBaseOpenHelper extends SQLiteOpenHelper {
&&&& public static final String DBNAME=&radiomap&;
&&&& public static final int VERSION=1;
&&&& public DateBaseOpenHelper(Context context){
&&&& &super(context,DBNAME,null,VERSION);
&@Override
&public void onCreate(SQLiteDatabase db) {
&&// TODO Auto-generated method stub
&&&&&& db.execSQL(&create table radiomap(location varchar(20),ap1 int,ap2 int)&);
&&&&&& long a=System.currentTimeMillis();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) select 'x=1,y=1',-80,-73 & +
&&&&&& &&&union all select 'x=2,y=3',80,40 union all select 'x=3,y=5',30,20 &+
&&& &&&& &union all select 'x=4,y=5',3,2 union all select 'x=30,y=50',30,20 union all select 'x=3,y=5',40,20&
&&&&&& &&+& union all select 'x=3,y=5',6,20 union all select 'x=3,y=5',6,7 union all select 'x=3,y=5',7,8 union all select 'x=3,y=5',8,9 union all select 'x=3,y=5',9,9& +
&&&&&& &&&&& union all select 'x=3,y=5',3,5 union all select 'x=3,y=5',7,20 union all select 'x=3,y=5',4,20 union all select 'x=3,y=5',5,20 union all select 'x=3,y=5',6,20& +
&&&&&& &&&&& union all select 'x=3,y=5',3,6 union all select 'x=3,y=5',7,7 union all select 'x=3,y=5',3,8 union all select 'x=3,y=5',8,2&);
&&&&&& long b=System.currentTimeMillis();
&&&&&& long c=b-a;
&&&&&& Log.i(&LocationActivity&, String.valueOf(c));
&&&&&& a=System.currentTimeMillis();
&&&&&& db.beginTransaction();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',1,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',1,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',1,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',2,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',2,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',3,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',3,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',3,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',4,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=7',5,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',4,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',5,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',5,5)&);
&&&&&& db.setTransactionSuccessful();
&&&&&& db.endTransaction();
&&&&&& b=System.currentTimeMillis();
&&&&&& Log.i(&LocationActivity&, String.valueOf(b-a));
&&&&&& a=System.currentTimeMillis();
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=7,y=8',7,8)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=8,y=9',8,9)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=9,y=10',9,10)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',6,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',2,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',2,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',2,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',3,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',3,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',3,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',4,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',4,4)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',4,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',5,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=7',6,5)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=6,y=7',5,7)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=4,y=5',6,3)&);
&&&&&& db.execSQL(&insert into radiomap(location,ap1,ap2) values('x=5,y=6',6,5)&);
&&&&&& b=System.currentTimeMillis();
&&&&&& Log.i(&LocationActivity&, String.valueOf(b-a));
第一种方式及:
insert into 表名(列名1,列名2)&&&&
&select&&值1,值2
&union all&
&select 值1,值2&&
&union all&
&select 值1,值2&
以上三种方式测试结果,及运行效率:
第一种方式为9ms
用事务的为:86ms
第三种直接用insert插入的为:29ms
这是因为本次测试用了20条数据,所以用事务的反而比不用的开销大时间长。若1000条以上则明显快于直接用insert插入的。
今天有个朋友测试 SQLite,然后得出的结论是:SQLite 效率太低,批量插入1000条记录,居然耗时2分钟!
下面是他发给我的测试代码。我晕~~~~~~
usingSystem.D
usingSystem.Data.SQL
//创建数据库文件
File.Delete(&test1.db3&);
SQLiteConnection.CreateFile(&test1.db3&);
DbProviderFactory factory=SQLiteFactory.I
using(DbConnection conn=factory.CreateConnection())
//连接数据库
conn.ConnectionString=&Data Source=test1.db3&;
conn.Open();
//创建数据表
stringsql=&create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)&;
DbCommand cmd=conn.CreateCommand();
cmd.Connection=
cmd.ExecuteNonQuery();
//添加参数
cmd.Parameters.Add(cmd.CreateParameter());
//开始计时
Stopwatch watch=newStopwatch();
watch.Start();
//连续插入1000条记录
for(inti=0; i&1000; i++)
mandText=&insert into [test1] ([s]) values (?)&;
cmd.Parameters[0].Value=i.ToString();
cmd.ExecuteNonQuery();
//停止计时
watch.Stop();
Console.WriteLine(watch.Elapsed);
哎~~~~一个常识性的错误,我加几行代码 (新增代码标记&// &-------------------&)。
usingSystem.D
usingSystem.Data.SQL
//创建数据库文件
File.Delete(&test1.db3&);
SQLiteConnection.CreateFile(&test1.db3&);
DbProviderFactory factory=SQLiteFactory.I
using(DbConnection conn=factory.CreateConnection())
//连接数据库
conn.ConnectionString=&Data Source=test1.db3&;
conn.Open();
//创建数据表
stringsql=&create table [test1] ([id] INTEGER PRIMARY KEY, [s] TEXT COLLATE NOCASE)&;
DbCommand cmd=conn.CreateCommand();
cmd.Connection=
cmd.ExecuteNonQuery();
//添加参数
cmd.Parameters.Add(cmd.CreateParameter());
//开始计时
Stopwatch watch=newStopwatch();
watch.Start();
DbTransaction trans=conn.BeginTransaction();//&-------------------
//连续插入1000条记录
for(inti=0; i&1000; i++)
mandText=&insert into [test1] ([s]) values (?)&;
cmd.Parameters[0].Value=i.ToString();
cmd.ExecuteNonQuery();
mit();//&-------------------
trans.Rollback();//&-------------------
//&-------------------
//停止计时
watch.Stop();
Console.WriteLine(watch.Elapsed);
执行一下,耗时0.2秒。这差距是不是太大了点?
为什么只是简单启用了一个事务会有这么大的差距呢?很简单,SQLite 缺省为每个操作启动一个事务,那么原代码1000次插入起码开启了1000个事务,&事务开启 + SQL 执行 + 事务关闭&自然耗费了大量的时间,这也是后面显示启动事务后为什么如此快的原因。其实这是数据库操作的基本常识,大家要紧记,不好的代码效率差的不是一点半点。
最近在做android项目的时候遇到一个问题,应用程序初始化时需要批量的向sqlite中插入大量数,导致应用启动过慢。
android使用的是sqlite数据库,sqlite是比较轻量级的数据库,在Google了之后发现,sqlite事务处理的问题,在sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作。我的应用初始5000条记录也就是要5000次读写磁盘操作。
解决方法:
添加事务处理,把5000条插入作为一个事务
dataBase.beginTransaction();&&&&&& //手动设置开始事务
//数据插入操作循环
dataBase.setTransactionSuccessful();&&&&&& //设置事务处理成功,不设置会自动回滚不提交
dataBase.endTransaction();&&&&&& //处理完成
SQLite的数据库本质上来讲就是一个磁盘上的文件,所以一切的数据库操作其实都会转化为对文件的操作,而频繁的文件操作将会是一个很好时的过程,会极大地影响数据库存取的速度。
例如:向数据库中插入100万条数据,在默认的情况下如果仅仅是执行
sqlite3_exec(db, “insert into name values ‘lxkxf', ‘24'; ”,0,0,&zErrMsg);
将会重复的打开关闭数据库文件100万次,所以速度当然会很慢。因此对于这种情况我们应该使用“事务”。
具体方法如下:在执行SQL语句之前和SQL语句执行完毕之后加上
rc=sqlite3_exec(db,&BEGIN;&,0,0,&zErrMsg);
//执行SQL语句
rc=sqlite3_exec(db,&COMMIT;&,0,0,&zErrMsg);
这样SQLite将把全部要执行的SQL语句先缓存在内存当中,然后等到COMMIT的时候一次性的写入数据库,这样数据库文件只被打开关闭了一次,效率自然大大的提高。有一组数据对比:
测试1:1000INSERTs
CREATE TABLE t1(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t1 VALUES(1,13153,'thirteen thousand one hundred fifty three');
INSERT INTO t1 VALUES(2,75560,'seventy five thousand five hundred sixty');
...995lines omitted
INSERT INTO t1 VALUES(998,66289,'sixty six thousand two hundred eighty nine');
INSERT INTO t1 VALUES(999,24322,'twenty four thousand three hundred twenty two');
INSERT INTO t1 VALUES(,'ninety four thousand one hundred forty two');
SQLite2.7.6:
SQLite2.7.6(nosync):
测试2: 使用事务25000INSERTs
CREATE TABLE t2(a INTEGER, b INTEGER, c VARCHAR(100));
INSERT INTO t2 VALUES(1,59672,'fifty nine thousand six hundred seventy two');
...24997lines omitted
INSERT INTO t2 VALUES(,'eighty nine thousand five hundred sixty nine');
INSERT INTO t2 VALUES(,'ninety four thousand six hundred sixty six');
SQLite2.7.6:
SQLite2.7.6(nosync):
可见使用了事务之后却是极大的提高了数据库的效率。但是我们也要注意,使用事务也是有一定的开销的,所以对于数据量很小的操作可以不必使用,以免造成而外的消耗。
参考知识库
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1241962次
积分:10820
积分:10820
排名:第1274名
原创:113篇
转载:238篇
评论:149条
(2)(1)(7)(24)(9)(8)(20)(6)(17)(59)(52)(51)(58)(4)(1)(1)(2)(9)(1)(3)(2)(4)(8)(2)foreach循环插入数据库时如何跳过数据库中已有的重复数据(去重) - CNode技术社区
积分: 1460
前某不知名公司项目总监,现某不知名电商平台产品总监,全能打杂。
在循环过程中如何跳过数据库中已有的重复数据?
如何剔除本次循环中的重复数据?
如果是sqlite数据库,那么可以用数据库内置的check特性,来阻止重复数据写入.
不知其他的数据库有这个特性没有.
不知道你是什么操作
定义什么是重复数据先
mongo的话可以定义unique index,然后插入时吃掉所有duplicate key error
underscore 里有 uniq 函数可以选出不重复的数组内容
uniq_.uniq(array, [isSorted], [iteratee]) Alias: unique
Produces a duplicate-free version of the array, using === to test object equality. If you know in advance that the array is sorted, passing true for isSorted will run a much faster algorithm. If you want to compute unique items based on a transformation, pass an iteratee function.
_.uniq([1, 2, 1, 3, 1, 4]);
=& [1, 2, 3, 4]
针对网mongodb中插入重复数据,我所使用的笨方法是使用update函数代替insert,设置upsert属性为true,这样遇到不存在的数据则插入,遇到已经存在的数据则更新。
就看你想不想覆盖库中的重复数据了。
如果想覆盖的话,参照 4L 的做法。
如果不想覆盖的话,保存之前用唯一字段去 $in 查询一次,然后排除现有数据中哪些重复的,再存储。
多谢多谢。哈哈
其实用unique index 试过了。但是插入的时候没有用duplicate
CNode 社区为国内最专业的 Node.js 开源技术社区,致力于 Node.js 的技术研究。
服务器赞助商为
,存储赞助商为
,由提供应用性能服务。
新手搭建 Node.js 服务器,推荐使用无需备案的

我要回帖

更多关于 sqlite 判断重复数据 的文章

 

随机推荐