在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的目的。

整体还是很简单,这个是我在做嵌入式项目中的一点心得:)

时间: 2024-10-14 00:46:10

在Sqlite中通过Replace来实现插入和更新的相关文章

sqlite中的replace、insert、update之前的区别

本文转自http://www.ithao123.cn/content-933827.html,在此感谢作者 android数据库操作,有两种方式,一种用android提供给我们的数据库操作函数insert.update.replace,我用到的就是这三种.另外一种方式就是利用数据库语言进行操作,也就是利用execSQL这个函数后面带sqlite数据库操作语言进行操作,sqlite中的sql语言和标准的sql语言大同小异,但是你如果是想有针对性的了解,建议你买一本书<SQLite权威指南>,这本

在SQLite中如何用一个表的字段更新另一个表

SQL语句: update table_1 set x = (select x from table_2 where table_1.y = table_2.y); 如果括号中临时建立的表中元素的个数小于table_1中元素个数或者只想更新table_1中部分x的值,可以在后面加where子句. Example:更新产品库存: update product set stock=(select stock from left where left.product_id=product.produc

mysql ON DUPLICATE KEY UPDATE重复插入时更新

mysql当插入重复时更新的方法: 第一种方法: 示例一:插入多条记录 假设有一个主键为 client_id 的 clients 表,可以使用下面的语句: INSERT INTO clients (client_id,client_name,client_type) SELECT supplier_id,supplier_name,'advertising' FROM suppliers WHERE not exists(select * from clients where clients.c

VC++对Access数据库的操作(查询、插入、更新、删除等)

Microsoft Office Access是由微软发布的关系数据库管理系统.Access数据库常应用于小型软件系统中,比如:生产管理.销售管理.库存管理等各类企业管理软件,其最大的优点是:简单易学.使用灵活. 下面我们结合实例来详细说明,在VC++ MFC中,如何使用Access数据库文件进行数据的存储,如何实现对数据库中数据的查询.插入.更新和删除等操作. (实例可在我的CSDN资源中下载:http://download.csdn.net/detail/margin1988/8235865

iOS之SQLite中的查询与排序 访问手机相册 向手机相册中存图

Day05 SQLite中的查询与排序 按查询结果排序:[[email protected][NSSortDescriptor sortDescriptorWithKey:@"age"ascending:yes]]; 设置查询条件: NSPredicate  *pre=nil; 1.比较运算符 > <  >=  <= == != pre=[NSPridicate [email protected]“age>40”]; 2. 范围运算符 IN  BETWEE

SQLite中的事务操作

关于SQLite事务可以解决一些问题,比如你要插入两个数据,可以将两个数据作为同一个事务进行插入,这样如果第二个数据错误了,便自动执行回滚操作,第一个数据也不会插入成功,保证了数据的同步! 举一个实际的例子: 应用程序初始化时需要批量的向sqlite中插入大量数据,单独的使用for+Insert方法导致应用响应缓慢,因为 sqlite插入数据的时候默认一条语句就是一个事务,有多少条数据就有多少次磁盘操作.我的应用初始5000条记录也就是要5000次读写磁盘操作.而且不能保证所有数据都能同时插入.

SQLite 中的各种限制

英文原文:Limits In SQLite     本文定义了 SQLite 的限制,如何针对这些限制定制特定的应用程序.默认的限制设置通常是适当的,几乎适合于每一个应用.有一些应用程序可能需要在这里或者那里增加一个设置,但是我们估计这非常罕见.更普遍的是,应用程序可能需要重新编译SQLite以及更低的限制来避免过多的资源利用率,以及在高级SQL语句生成器上帮助阻止攻击者注入恶意SQL语句时发生错误. 在使用 sqlite3_limit() 接口的 limit categories 上,为该接口

FireDAC 下的 Sqlite [5] - 数据的插入、更新、删除

先在空白窗体上添加: TFDConnection.TFDPhysSQLiteDriverLink.TFDGUIxWaitCursor.TFDQuery.TDataSource.TDBGrid(并在设计时关联好).你也可以复制下面文本框中的内容, 然后直接往窗体上贴, 以快速完成以上的添加过程:object DBGrid1: TDBGrid Left = 16 Top = 88 Width = 361 Height = 329 DataSource = DataSource1 TabOrder =

Sqlite中使用SQL与其他数据库的区别

Sqlite作为Android中的主流数据库而广为使用,但是他的sql语言与一般的大型数据库所使用的SQL语言还是有一些区别的,本文总结如下: 1.TOP 在SQL Server中,我们使用TOP来获取前N条数据: SELECT TOP 10 * FROM [index] ORDER BY indexid DESC; 但是在Sqlite中,大家会发现这是不行的,我们需要这么写: SELECT * FROM [index] ORDER BY indexid DESC limit 0,10; 通过l