檢查數據庫中是否已存在某記錄(如 URL 去重)是高頻需求。除常規 SELECT COUNT(*) 外,本文匯總多種寫法並分析優劣。
public static bool BeUrl(string url) {
string sql = "SELECT count(1) FROM [navurl] WHERE [url]=@url";
SqlParameter param = new SqlParameter("@url", SqlDbType.VarChar, 50) { Value = url };
return DbHelper.Exists(sql, param);
}
| 方法 | SQL 範例 | 優點 | 缺點 |
|---|---|---|---|
| EXISTS | IF EXISTS(SELECT 1 FROM navurl WHERE url=@url) SELECT 1 ELSE SELECT 0 | 發現首筆即停止掃描 | 需包裹在存儲過程或批次中 |
| TOP 1 | SELECT TOP 1 1 FROM navurl WHERE url=@url | 語法簡單,同樣早停 | 需判斷返回行數 |
| COUNT(1) 配合索引 | SELECT COUNT(1) FROM navurl WHERE url=@url | 語義清晰,優化器友好 | 全表掃描時較慢 |
| MERGE / UPSERT | MERGE INTO navurl ... WHEN NOT MATCHED THEN INSERT ... | 原子性檢查+插入 | SQL Server 2008+,語法複雜 |
MERGE 或帶 HOLDLOCK 的 EXISTS 避免競態條件。SELECT * 或 COUNT(*) 無索引全掃描。單純判斷存在性,EXISTS 或 TOP 1 配合索引最優;若需同時插入,MERGE 是原子操作首選。