維基百科對 UPSERT 的說明:(取自「Merge (SQL)」條目)
A relational database management system uses SQL MERGE (also called upsert) statements to INSERT new records or UPDATE existing records depending on whether or not a condition matches.
在 MySQL 裡的兩種語法其實就是在實做這個需求:
REPLACE INTO ...
INSERT INTO ... ON DUPLICATE KEY UPDATE ...
而前者其實是後者的一個特例 (當 INSERT 發現有 dupe key 時把現有的 record 改成與 INSERT 時相同的條件)。
而計數器是後者常見的 case 之一:當 record 不存在的時候塞一筆進去,並且將 counter 設為 1;當 record 存在的時候對 counter 加一更新。像是這樣的 SQL query:
INSERT INTO my_table SET id = ?, num = 1 ON DUPLICATE KEY UPDATE num = num + 1;
由於這是常見的需求,使得這個語法是目前少數 MySQL 比 PostgreSQL 好用的地方。
在「A Case for Upserts」這篇就看到抱怨 PostgreSQL 不實做這個功能...
不過我覺得作者寫得有點誇張,INSERT INTO ... ON DUPLICATE KEY UPDATE ...
應該是可以模擬出來的功能:當 INSERT 失敗後再跑 UPDATE。而 REPLACE INTO ...
是特例,也就當然可以模擬出來。