在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客戶端數據庫管理工具,來創建數據表,對應字段如下:

image

 

然後,標籤切換到“索引”欄:

image

這裏我將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;

image

當第二次執行時,由於表中已經存在相同的“Name”和“Author”的數據,於是不進行插入,而命令將轉換爲Update。

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

REPLACE INTO tbl_book 
  ( 
    Name , 
    Author , 
    PublishDate , 
    pagecount , 
    Memo 
  ) 
VALUES 
  ( 
    'WF高級程序設計' , 
    'Bruce Bukovics' , 
    date( ) , 
    500 ,   -- 頁碼總數改變 
    'Test2' -- 備註改變
  ) ;

執行結果:

image

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

 

然後我修改Name名稱:

REPLACE INTO tbl_book 
  ( 
    Name , 
    Author , 
    PublishDate , 
    pagecount , 
    Memo 
  ) 
VALUES 
  ( 
    'WPF揭祕' ,     -- 書名改變
    'Bruce Bukovics' , 
    date( ) , 
    500 ,    
    'Test2' 
  ) ;

執行結果:

image

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

 

這樣,您就可以通過在表中創建唯一索引並且利用Replace達到Insert OR Update的目的。

 

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

(補充一下:在.NET中,插入或者更新日期字段的時候,會出現一些問題,這裏你需要將傳值的日期格式通過ToString(“s”),來進行插入或更新)

 

作者:Leepy
 
郵箱:sunleepy(AT)gmail.com
 

 

發佈了15 篇原創文章 · 獲贊 2 · 訪問量 4萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章