在Sqlite中通过Replace来实现插入和更新

Keep Open and Learning
Post Reply
星际浪子
Posts: 3597
Joined: 01 May 2009 23:45

在Sqlite中通过Replace来实现插入和更新

Post by 星际浪子 » 28 Dec 2011 14:55

[align=left][align=left]
[font=宋体]你可能在批量处理一个事务的时候,想要批量插入一系列的数据,但是这些数据当添加完一次之后,重新添加的时候,你不想要重新添加,只是想将原有的数据进行更新,例如:我想要通过[/font]

[font="]Excel[/font]

[font=宋体]将一系列的图书导入到数据库中,而这些图书在你下一次编辑之后,重新导入,只是对原有的数据进行修改。以上是一个业务的场景。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font=宋体]在[/font]

[font="]MSSQL[/font]

[font=宋体]中,你可以使用诸如:[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="]?

[/font]

[/align][/align][table=98%] [tr] [td=1,1,928] [align=left][align=left][font=宋体]IF NOT EXISTS(SELECT * FROM Book WHERE ….) THEN INSERT INTO ... ELSE UPDATE SET ...[/font]

[/align][/align] [/td] [/tr][/table][align=left][align=left][font=宋体]这样的[/font]

[font="]SQL[/font]

[font=宋体]语法表示。而在[/font]

[font="]SQLite[/font]

[font=宋体]中,不支持这样的语法。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font=宋体]而对应的[/font]

[font="],[/font]

[font=宋体]在[/font]

[font="]Sqlite[/font]

[font=宋体]中可以使用[/font]

[font="] Replace Into [/font]

[font=宋体]或者[/font]

[font="] Insert Or Replace Into [/font]

[font=宋体]这样的语法格式。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="] [/font]

[/align][/align][align=left][align=left][font=宋体]现在,我使用[/font]

[font="]SQLite Developer[/font]

[font=宋体]的[/font]

[font="]Sqlite[/font]

[font=宋体]客户端数据库管理工具,来创建数据表,对应字段如下:[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="][img]file:///C:/DOCUME~1/mscpub/LOCALS~1/Temp/msohtmlclip1/01/clip_image002.gif[/img][/font]



[font="][/font]

[/align][/align][align=left][align=left][font="] [/font]

[/align][/align][align=left][align=left][font=宋体]然后,标签切换到[/font]

[font="]“[/font]

[font=宋体]索引[/font]

[font="]”[/font]

[font=宋体]栏:[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="][img]file:///C:/DOCUME~1/mscpub/LOCALS~1/Temp/msohtmlclip1/01/clip_image004.gif[/img][/font]



[font="][/font]

[/align][/align][align=left][align=left][font=宋体]这里我将[/font]

[font="]Name([/font]

[font=宋体]书名[/font]

[font="])[/font]

[font=宋体]和[/font]

[font="]Author([/font]

[font=宋体]作者[/font]

[font="])[/font]

[font=宋体]创建索引,并且规定为唯一索引。保存数据表。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font=宋体]这样就意味着只要[/font]

[font="]Name[/font]

[font=宋体]和[/font]

[font="]Author[/font]

[font=宋体]对应是相同的,[/font]

[font="]Replace into [/font]

[font=宋体]对应的就变成[/font]

[font="] Update[/font]

[font=宋体],如果不完成相同,就对应变成[/font]

[font="] Insert [/font]

[font=宋体]语句。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="] [/font]

[/align][/align][align=left][align=left][font=宋体]于是我在[/font]

[font="]“[/font]

[font=宋体]查询数据[/font]

[font="]”[/font]

[font=宋体]中,执行[/font]

[font="]SQL[/font]

[font=宋体]语句:[/font]

[font="][/font]

[/align][/align][table=98%] [tr] [td=1,1,911] [align=left][align=left][font=宋体]REPLACE INTO tbl_book [/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] Name , [/font]

[/align][/align] [align=left][align=left][font=宋体] Author , [/font]

[/align][/align] [align=left][align=left][font=宋体] PublishDate , [/font]

[/align][/align] [align=left][align=left][font=宋体] pagecount , [/font]

[/align][/align] [align=left][align=left][font=宋体] Memo [/font]

[/align][/align] [align=left][align=left][font=宋体] ) [/font]

[/align][/align] [align=left][align=left][font=宋体]VALUES[/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] 'WF[/font]

[font=宋体]高级程序设计' ,

[/font]

[/align][/align] [align=left][align=left][font=宋体] 'Bruce Bukovics' , [/font]

[/align][/align] [align=left][align=left][font=宋体] date( ) , [/font]

[/align][/align] [align=left][align=left][font=宋体] 454 , [/font]

[/align][/align] [align=left][align=left][font=宋体] 'Test'[/font]

[/align][/align] [align=left][align=left][font=宋体] ) ;[/font]

[/align][/align] [/td] [/tr][/table][align=left][align=left][font=宋体]第一次执行时,由于表中没有数据,所以命令转换为[/font]

[font="]Insert[/font]

[font=宋体];[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="][img]file:///C:/DOCUME~1/mscpub/LOCALS~1/Temp/msohtmlclip1/01/clip_image006.gif[/img][/font]



[font="][/font]

[/align][/align][align=left][align=left][font=宋体]当第二次执行时,由于表中已经存在相同的[/font]

[font="]“Name”[/font]

[font=宋体]和[/font]

[font="]“Author”[/font]

[font=宋体]的数据,于是不进行插入,而命令将转换为[/font]

[font="]Update[/font]

[font=宋体]。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font=宋体]因此,当你执行以下语句时:[/font]

[font="][/font]

[/align][/align][table=98%] [tr] [td=1,1,911] [align=left][align=left][font=宋体]REPLACE INTO tbl_book [/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] Name , [/font]

[/align][/align] [align=left][align=left][font=宋体] Author , [/font]

[/align][/align] [align=left][align=left][font=宋体] PublishDate , [/font]

[/align][/align] [align=left][align=left][font=宋体] pagecount , [/font]

[/align][/align] [align=left][align=left][font=宋体] Memo [/font]

[/align][/align] [align=left][align=left][font=宋体] ) [/font]

[/align][/align] [align=left][align=left][font=宋体]VALUES[/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] 'WF[/font]

[font=宋体]高级程序设计' ,

[/font]

[/align][/align] [align=left][align=left][font=宋体] 'Bruce Bukovics' , [/font]

[/align][/align] [align=left][align=left][font=宋体] date( ) , [/font]

[/align][/align] [align=left][align=left][font=宋体] 500 , -- [/font]

[font=宋体]页码总数改变

[/font]

[/align][/align] [align=left][align=left][font=宋体] 'Test2' -- [/font]

[font=宋体]备注改变

[/font]

[/align][/align] [align=left][align=left][font=宋体] ) ;[/font]

[/align][/align] [/td] [/tr][/table][align=left][align=left][font=宋体]执行结果:[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="][img]file:///C:/DOCUME~1/mscpub/LOCALS~1/Temp/msohtmlclip1/01/clip_image008.gif[/img][/font]



[font="][/font]

[/align][/align][align=left][align=left][font=宋体]页码和备注都改变了,说明这里执行了[/font]

[font="]Update[/font]

[font=宋体]。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="] [/font]

[/align][/align][align=left][align=left][font=宋体]然后我修改[/font]

[font="]Name[/font]

[font=宋体]名称:[/font]

[font="][/font]

[/align][/align][table=98%] [tr] [td=1,1,911] [align=left][align=left][font=宋体]REPLACE INTO tbl_book [/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] Name , [/font]

[/align][/align] [align=left][align=left][font=宋体] Author , [/font]

[/align][/align] [align=left][align=left][font=宋体] PublishDate , [/font]

[/align][/align] [align=left][align=left][font=宋体] pagecount , [/font]

[/align][/align] [align=left][align=left][font=宋体] Memo [/font]

[/align][/align] [align=left][align=left][font=宋体] ) [/font]

[/align][/align] [align=left][align=left][font=宋体]VALUES[/font]

[/align][/align] [align=left][align=left][font=宋体] ( [/font]

[/align][/align] [align=left][align=left][font=宋体] 'WPF[/font]

[font=宋体]揭秘' , --

书名改变

[/font]

[/align][/align] [align=left][align=left][font=宋体] 'Bruce Bukovics' , [/font]

[/align][/align] [align=left][align=left][font=宋体] date( ) , [/font]

[/align][/align] [align=left][align=left][font=宋体] 500 , [/font]

[/align][/align] [align=left][align=left][font=宋体] 'Test2'[/font]

[/align][/align] [align=left][align=left][font=宋体] ) ;[/font]

[/align][/align] [/td] [/tr][/table][align=left][align=left][font=宋体]执行结果:[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="][img]file:///C:/DOCUME~1/mscpub/LOCALS~1/Temp/msohtmlclip1/01/clip_image010.gif[/img][/font]



[font="][/font]

[/align][/align][align=left][align=left][font=宋体]插入了一条图书的记录,同样你也可以尝试改变[/font]

[font="]Author[/font]

[font=宋体],同样也是插入记录。[/font]

[font="][/font]

[/align][/align][align=left][align=left][font="] [/font]

[/align][/align][align=left][align=left][font=宋体]这样,您就可以通过在表中创建唯一索引并且利用[/font]

[font="]Replace[/font]

[font=宋体]达到[/font]

[font="]Insert OR Update[/font]

[font=宋体]的目的。[/font]

[font="][/font]

[/align][/align]

Post Reply