2011年7月8日 星期五

SQLite 的 on duplicate update

MySQL 的 insert ... on duplicate update 相當方便, 可惜不是標準語法。參考這篇得知, SQLite 有兩種相關語法:

  1. insert or ignore into ...
  2. insert or update into ...

第一個語法和 MySQL 的 insert ignore 一樣, 而第二個的行為有所不同, 它會先 delete 再 insert。所以若有設 primary key 為 auto increment, 執行 insert or update into 後, primary key 會變。

所以該篇文章提供的作法是:

INSERT OR IGNORE INTO visits VALUES ($ip, 0);
UPDATE visits SET hits = hits + 1 WHERE ip LIKE $ip;

這樣的好處是

  • 邏輯簡單, 不用先 select 再決定要做 insert 或 update
  • update 就是 update, 不是先刪除再 insert, 所以 primary key 不會變

唯一的缺點是不論原本有無資料都要執行兩次 SQL, 但對 SQLite 的應用來說, 這無關緊要。

沒有留言:

張貼留言

在 Fedora 下裝 id-utils

Fedora 似乎因為執行檔撞名,而沒有提供 id-utils 的套件 ,但這是使用 gj 的必要套件,只好自己編。從官網抓好 tarball ,解開來編譯 (./configure && make)就是了。 但編譯後會遇到錯誤: ./stdio.h:10...