一直以來在使用SQL語句的時候都是力求簡潔,把SQL精簡到最優化以提高效率。這是做Web程序時養成的習慣。不過,最近在一個c#程序中使用到嵌入式數據庫SQLite,讓我對SQL語句的要求更提高了一步。例如,在向數據庫中插入新行時,如果違背了某一唯一性約束。那麼整個更新過程就會失敗。更要命的是如果同時插入1000條、10000條甚至更多條數據的時候,如果僅僅因為某條數據出錯,導致整個過程rollback了,似乎在性能上就得不償失了。
起初我想了一個比較笨的辦法,聰明的你可能已經想到了^_^,先用select語句查詢是否存在重復,剔除到重復後在插入新數據。對於大批量數據的插入/更新,這的的確確是個笨辦法。
後來想到用觸發器做這個,效果不錯,但為這麼個簡單的問題就動用觸發器似乎也不合理喔。最後在查詢手冊的過程發現了一條語句可以很好地解決重復問題。
ON CONFLICT conflict-algorithm
conflict-algorithm ::= ROLLBACK | ABORT | FAIL | IGNORE | REPLACE
這個是用在新建數據表的時候,如果是在插入或更新語句中使用就可以使用 OR 代替 ON Conflict。
例如: insert or ignore into table (fields) values (values);
或者干脆使用 replace into table (fields) values (values);
replace = insert or replace
很好地解決了更新/插入重復的問題^_^