Posted on 2013-06-09 15:40
pts 閱讀(528)
評論(0) 編輯 收藏
From:http://www.cnblogs.com/liping13599168/archive/2011/05/24/2054908.html
你可能在批量處理一個事務的時候,想要批量插入一系列的數據,但是這些數據當添加完一次之后,重新添加的時候,你不想要重新添加,只是想將原有的數據進行更新,例如:我想要通過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的目的。