在SQLite中通過Replace來實(shí)現(xiàn)插入和更新
你可能在批量處理一個事務(wù)的時候,想要批量插入一系列的數(shù)據(jù),但是這些數(shù)據(jù)當(dāng)添加完一次之后,重新添加的時候,你不想要重新添加,只是想將原有的數(shù)據(jù)進(jìn)行更新,例如:我想要通過Excel將一系列的圖書導(dǎo)入到數(shù)據(jù)庫中,而這些圖書在你下一次編輯之后,重新導(dǎo)入,只是對原有的數(shù)據(jù)進(jìn)行修改。以上是一個業(yè)務(wù)的場景。
在MSSQL中,你可以使用諸如:
- view sourceprint?IF NOT EXISTS(SELECT * FROM Book WHERE ….) THEN INSERT INTO ... ELSE UPDATE SET ...
這樣的SQL語法表示。而在SQLite中,不支持這樣的語法。
而對應(yīng)的,在Sqlite中可以使用 Replace Into 或者 Insert Or Replace Into 這樣的語法格式。
現(xiàn)在,我使用SQLite Developer的Sqlite客戶端數(shù)據(jù)庫管理工具,來創(chuàng)建數(shù)據(jù)表,對應(yīng)字段如下:
然后,標(biāo)簽切換到“索引”欄:
這里我將Name(書名)和Author(作者)創(chuàng)建索引,并且規(guī)定為***索引。保存數(shù)據(jù)表。
這樣就意味著只要Name和Author對應(yīng)是相同的,Replace into 對應(yīng)的就變成 Update,如果不完成相同,就對應(yīng)變成 Insert 語句。
于是我在“查詢數(shù)據(jù)”中,執(zhí)行SQL語句:
- view sourceprint?01REPLACE INTO tbl_book
- (
- Name ,
- Author ,
- PublishDate ,
- pagecount ,
- Memo
- )
- VALUES
- (
- 'WF高級程序設(shè)計(jì)' ,
- 'Bruce Bukovics' ,
- date( ) ,
- 454 ,
- 'Test'
- ) ;
***次執(zhí)行時,由于表中沒有數(shù)據(jù),所以命令轉(zhuǎn)換為Insert;
當(dāng)?shù)诙螆?zhí)行時,由于表中已經(jīng)存在相同的“Name”和“Author”的數(shù)據(jù),于是不進(jìn)行插入,而命令將轉(zhuǎn)換為Update。
因此,當(dāng)你執(zhí)行以下語句時:
- view sourceprint?01REPLACE INTO tbl_book
- (
- Name ,
- Author ,
- PublishDate ,
- pagecount ,
- Memo
- )
- VALUES
- (
- 'WF高級程序設(shè)計(jì)' ,
- 'Bruce Bukovics' ,
- date( ) ,
- 500 , -- 頁碼總數(shù)改變
- 'Test2' -- 備注改變
- ) ;
執(zhí)行結(jié)果:
頁碼和備注都改變了,說明這里執(zhí)行了Update。
然后我修改Name名稱:
- view sourceprint?01REPLACE INTO tbl_book
- (
- Name ,
- Author ,
- PublishDate ,
- pagecount ,
- Memo
- )
- VALUES
- (
- 'WPF揭秘' , -- 書名改變
- 'Bruce Bukovics' ,
- date( ) ,
- 500 ,
- 'Test2'
- ) ;
執(zhí)行結(jié)果:
插入了一條圖書的記錄,同樣你也可以嘗試改變Author,同樣也是插入記錄。
這樣,您就可以通過在表中創(chuàng)建***索引并且利用Replace達(dá)到Insert OR Update的目的。
整體還是很簡單,這個是我在做嵌入式項(xiàng)目中的一點(diǎn)心得:)
(補(bǔ)充一下:在.NET中,插入或者更新日期字段的時候,會出現(xiàn)一些問題,這里你需要將傳值的日期格式通過ToString(“s”),來進(jìn)行插入或更新)
原文鏈接:http://www.cnblogs.com/liping13599168/archive/2011/05/24/2054908.html