題設:
由於遇到程序從MYSQL向SQLSERVER遷移的需求,需要對MYSQL的SQL語法進行相應改造,發現原來程序中有這么一段語句INSERT INTO forum_threads (siteid,tid,author,authorid,subject,dateline,message,useip,pid,recycledate) VALUES({0},{1},'{2}',{3},'{4}','{5}','{6}','{7}',{8},now()) ON DUPLICATE KEY UPDATE recycledate=now();由於MYSQL中INSERT ON DUPLICATE KEY UPDATE語法是原子操作,效率和語法都非常之優美,
分析:
SQLSERVER中沒有類似INSERT ON DUPLICATE KEY UPDATE的語法
解決:
1.傳統解決方案
分拆SQL語句為
if exists then
update;
else
insert;
優點就是易於理解,不足就是破壞了原來語句的原子性,用2個語句來實現,效率低
2.推薦的方案(有點陰險)
通過SQLServer創建索引時,有一個IGNORE_DUP_KEY的選項,可以類似實現。
摘抄語法說明如下:
IGNORE_DUP_KEY = { ON | OFF }
指定對唯一聚集索引或唯一非聚集索引執行多行插入操作時出現重復鍵值的錯誤響應。默認值為 OFF。
ON
發出一條警告信息,但只有違反了唯一索引的行才會失敗。
OFF
發出錯誤消息,並回滾整個 INSERT 事務。
IGNORE_DUP_KEY 設置僅適用於創建或重新生成索引后發生的插入操作。該設置在索引創建操作期間無效。
對於 XML 索引以及對視圖創建的索引,IGNORE_DUP_KEY 不能設置為 ON。
在向后兼容的語法中,WITH IGNORE_DUP_KEY 等效於 WITH IGNORE_DUP_KEY = ON。
孰優孰劣,留待大家自己評測,這里只是提供2種方案,拋磚引玉.
