在Sqlite中通过Replace来实现插入和更新
你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过Excel将一系列的图书导入到数据库中,而这些图书在你下一次编辑之后,重新导入,只是对原有的数据进行修改。以上是一个业务的场景。
在MSSQL中,你可以使用诸如:
IF NOT EXISTS( SELECT * FROM Book WHERE ….) THEN INSERT INTO ... ELSE UPDATE SET ...
|
这样的SQL语法表示。而在SQLite中,不支持这样的语法。
而对应的,在Sqlite中可以使用 Replace Into 或者 Insert Or Replace Into 这样的语法格式。
现在,我使用SQLite Developer的Sqlite客户端数据库管理工具,来创建数据表,对应字段如下:
然后,标签切换到“索引”栏:
这里我将Name(书名)和Author(作者)创建索引,并且规定为唯一索引。保存数据表。
这样就意味着只要Name和Author对应是相同的,Replace into 对应的就变成 Update,如果不完成相同,就对应变成 Insert 语句。
于是我在“查询数据”中,执行SQL语句:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
REPLACE INTO tbl_book
(
Name ,
Author ,
PublishDate ,
pagecount ,
Memo
)
VALUES
(
'WF高级程序设计' ,
'Bruce Bukovics' ,
date ( ) ,
454 ,
'Test'
) ;
|
第一次执行时,由于表中没有数据,所以命令转换为Insert;
当第二次执行时,由于表中已经存在相同的“Name”和“Author”的数据,于是不进行插入,而命令将转换为Update。
因此,当你执行以下语句时:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
REPLACE INTO tbl_book
(
Name ,
Author ,
PublishDate ,
pagecount ,
Memo
)
VALUES
(
'WF高级程序设计' ,
'Bruce Bukovics' ,
date ( ) ,
500 , -- 页码总数改变
'Test2' -- 备注改变
) ;
|
执行结果:
页码和备注都改变了,说明这里执行了Update。
然后我修改Name名称:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
REPLACE INTO tbl_book
(
Name ,
Author ,
PublishDate ,
pagecount ,
Memo
)
VALUES
(
'WPF揭秘' , -- 书名改变
'Bruce Bukovics' ,
date ( ) ,
500 ,
'Test2'
) ;
|
执行结果:
插入了一条图书的记录,同样你也可以尝试改变Author,同样也是插入记录。
这样,您就可以通过在表中创建唯一索引并且利用Replace达到Insert OR Update的目的。
整体还是很简单,这个是我在做嵌入式项目中的一点心得:)
(补充一下:在.NET中,插入或者更新日期字段的时候,会出现一些问题,这里你需要将传值的日期格式通过ToString(“s”),来进行插入或更新)
感谢原作者的详细讲解:http://www.cnblogs.com/liping13599168/archive/2011/05/24/2054908.html
转载于:https://www.cnblogs.com/zhulinyixuan/archive/2012/10/09/2717091.html
在Sqlite中通过Replace来实现插入和更新相关推荐
- Oracle数据库----表中数据的操作(插入、更新、删除数据)
文章目录 一.插入数据 插入多行数据的简单方法: 1.将表一的全部数据添加到表二中 创建副本Courses1,只复制Courses的结构 将Courses表中的数据拷贝到Courses1中 创建副本的 ...
- VC++对Access数据库的操作(查询、插入、更新、删除等)
Microsoft Office Access是由微软发布的关系数据库管理系统.Access数据库常应用于小型软件系统中,比如:生产管理.销售管理.库存管理等各类企业管理软件,其最大的优点是:简单易学 ...
- SQLite中特殊的INSERT语句
SQLite中特殊的INSERT语句 在SQLite中,INSERT是基本语句,用来向表中插入数据.但是当表中存在字段存在唯一.非空.检查.主键等约束时,插入的数据很容易和约束冲突,造成插入操作失败. ...
- sqlite 复合唯一索引_sqlite 批量插入, 重复插入(更新)
[FMDBManager inDatabase:^(FMDatabase *db) { [db shouldCacheStatements]; //开始启动事务 [db beginTransactio ...
- 【数据库】sqlite中的限制:数据库大小、表数、列数、行数、参数个数、连接数等
目录 一.参考网址 二.详解 1.查看.设置sqlite限制命令.limit 2.SQLite中的限制汇总 1)字符串或BLOB的最大长度 2)最大列数 3)SQL语句的最大长度 4)联接中的最大表数 ...
- SQLITE中原子提交的实现
转自:http://blog.csdn.net/LocalVar/archive/2008/02/13/3620555.aspx 1. 引言 像SQLITE这样支持事务的数据库的一个重要特性是& ...
- SQLite中的高级SQL
插入记录 使用insert插入记录.insert在表单上工作,使用insert命令可以一次插入一条记录,使用select命令可以一次插入多条记录.insert语句的一般格式为: [sql] view ...
- sqlite中常见的问题总结
一.sqlite中不能使用日期进行相减,执行结果无效 例如:SELECT count(*) as cnt FROM DayBanalces WHERE (date(ofDay)- date('2013 ...
- mysql 正则替换 换行,MySQL中使用replace、regexp进行正则表达式替换的用法分析
本文实例讲述了MySQL中使用replace.regexp进行正则表达式替换的用法.,具体如下: 今天一个朋友问我,如果将数据库中查到的类似于"./uploads/110100_cityHo ...
- sqllite查询数据量_详解SQLite中的查询规划器
1.0 介绍 查询规划器的任务是找到最好的算法或者说"查询计划"来完成一条SQL语句.早在SQLite 3.8.0版本,查询规划器的组成部分已经被重写使它可以运行更快并且生成更好的 ...
最新文章
- 屠榜大杀器UniMP!百度登顶图神经网络权威榜单三项榜首
- 红黑树分为红和黑有什么好处_彻底搞懂红黑树
- c语言可以通过malloc在栈上,C语言内部静态成员陷阱
- [转]SQL Server 2005 分区表实践——建立分区表(partition table)
- 准爸爸日记——20120311
- Dataset之Handwritten Digits:Handwritten Digits(手写数字图片识别)数据集简介、安装、使用方法之详细攻略
- web前端之HTML中的div
- YOLOv3中darknet的各种层的说明
- easyui 年份下拉框的构建
- Hadoop Namenode不能启动
- python退出程序 只跳出while_为什么我的简单程序从不退出while循环?
- 热更新Sophix的爬坑之路
- 阿里平头哥首次交货——玄铁910是个啥?是芯片吗?
- IBM服务器raid5崩溃数据恢复方法
- 机器学习 k-近邻算法
- MFC中CImage类显示的半透明PNG存在的问题以及处理方法
- Java对象空间分配流程
- KNN算法和Kernel KNN算法的区别
- 优思学院:六西格玛的热潮
- 读《孙子兵法》,品启强人生
热门文章
- [codeup 2031]To Fill or Not to Fill
- 阿里云云计算 52在线实验--云监控初体验
- 安装完jdk在cmd输入Java没有反应的解决办法
- mac 10.9 安装 mysql_mac 下安装 mysql (蛋疼)
- python用小矩形标记数据点_Python – 在散点处绘制已知大小的矩形
- Linux 14.04 CUDA theano安装
- linux不解压情况下查看压缩包内文件的总行数、文件列表的数目
- 武汉理工计算机专考研专业课,2017武汉理工大学考研计算机专业课真题
- HW护网即将开始4.6
- Raki的读paper小记:PURE:A Frustratingly Easy Approach for Entity and Relation Extraction