在Sqlite中通過Replace來實現插入和更新

2021-09-06 03:27:27 字數 2242 閱讀 6186

你可能在批量處理乙個事務的時候,想要批量插入一系列的資料,但是這些資料當新增完一次之後,重新新增的時候,你不想要重新新增,只是想將原有的資料進行更新,例如:我想要通過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語句:

replace into tbl_book 

( name ,

author ,

publishdate ,

pagecount ,

memo

) values

( 'wf高階程式設計' ,

'bruce bukovics' ,

date( ) ,

454 ,

'test'

) ;

第一次執行時,由於表中沒有資料,所以命令轉換為insert;

當第二次執行時,由於表中已經存在相同的「name」和「author」的資料,於是不進行插入,而命令將轉換為update。

因此,當你執行以下語句時:

replace into tbl_book 

( name ,

author ,

publishdate ,

pagecount ,

memo

) values

( 'wf高階程式設計' ,

'bruce bukovics' ,

date( ) ,

500 , -- 頁碼總數改變

'test2' -- 備註改變

) ;

執行結果:

頁碼和備註都改變了,說明這裡執行了update。

然後我修改name名稱:

replace into tbl_book 

( name ,

author ,

publishdate ,

pagecount ,

memo

) values

( 'wpf揭秘' , -- 書名改變

'bruce bukovics' ,

date( ) ,

500 ,

'test2'

) ;

執行結果:

插入了一條圖書的記錄,同樣你也可以嘗試改變author,同樣也是插入記錄。

這樣,您就可以通過在表中建立唯一索引並且利用replace達到insert or update的目的。

整體還是很簡單,這個是我在做嵌入式專案中的一點心得:)

(補充一下:在.net中,插入或者更新日期欄位的時候,會出現一些問題,這裡你需要將傳值的日期格式通過tostring(「s」),來進行插入或更新)

在Sqlite中通過Replace來實現插入和更新

你可能在批量處理乙個事務的時候,想要批量插入一系列的資料,但是這些資料當新增完一次之後,重新新增的時候,你不想要重新新增,只是想將原有的資料進行更新,例如 我想要通過excel將一系列的圖書匯入到資料庫中,而這些圖書在你下一次編輯之後,重新匯入,只是對原有的資料進行修改。以上是乙個業務的場景。在ms...

在C 中運用 SQLite

在c 中運用 sqlite 中小 雙擊滾屏 id,bookname,price values id,bookname,price cmd.parameters.add new sqliteparameter id book.id cmd.parameters.add new sqliteparame...

DbUtils在SQLite中的應用

dbutils.persistentdb 實現了強硬的 執行緒安全的 頑固的資料庫連線,使用db api 2模組。dbutils.pooleddb 實現了乙個強硬的 執行緒安全的 有快取的 可復用的資料庫連線。dbutils作用有三 1.丟乙個sql,給乙個結果 2.把結果包裝成bean map l...