在
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);
以 aardio 官方网站代码为例
import
win.ui;
import sqlite;
/*DSG{{*/
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=16777215;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" )
if ( not sqlConnection.existsTable( "jsyou" ) ){
sqlConnection.exec( "create table jsyou(id INTEGER PRIMARY KEY AUTOINCREMENT,name,password);" )
}
}
读取= function (){
开启()
mainForm.listview.clear()
for (k,name,password in 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.count;
var name=mainForm.edit.text;
var password=mainForm.edit2.text
mainForm.listview.addItem({
tostring (count+1);
name;
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();
import sqlite;
/*DSG{{*/
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=16777215;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" )
if ( not sqlConnection.existsTable( "jsyou" ) ){
sqlConnection.exec( "create table jsyou(id INTEGER PRIMARY KEY AUTOINCREMENT,name,password);" )
}
}
读取= function (){
开启()
mainForm.listview.clear()
for (k,name,password in 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.count;
var name=mainForm.edit.text;
var password=mainForm.edit2.text
mainForm.listview.addItem({
tostring (count+1);
name;
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();