首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 更多程式語言 >> 程式設計疑難解答

C# SQL 自增 ID 陷阱:字串型 ID 導致 MAX() 排序錯誤

     編輯:程式設計疑難解答

問題現象

手動查詢 SELECT MAX(id) FROM VisitorLog 計算下一個 ID,資料筆數超過 10 筆後新 ID 停留在 10,不再遞增。

根本原因

id 欄位型別為 字串 (VARCHAR/CHAR),而非整數。字串排序按 ASCII 碼逐字元比較:

'1' < '2' < ... < '9' < '10' (因 '1' == '1',比較下一字元:無 vs '0' → 視為較小)
結果:MAX('9', '10') = '9'

正確解法(二選一)

方案一:資料庫層面自增(推薦)

-- SQL Server
ALTER TABLE VisitorLog ALTER COLUMN id INT IDENTITY(1,1);
-- MySQL
ALTER TABLE VisitorLog MODIFY id INT AUTO_INCREMENT PRIMARY KEY;

插入時不指定 id,資料庫自動分配,SCOPE_IDENTITY() 或 LAST_INSERT_ID() 取得新值。

方案二:程式碼修正(不改結構)

string sql = "SELECT CAST(MAX(id) AS UNSIGNED) FROM VisitorLog"; // MySQL
// 或 SQL Server: SELECT MAX(CAST(id AS INT)) FROM VisitorLog
// 執行查詢取得 int maxId,新 ID = maxId + 1

但強烈不建議:並發環境下極易產生重複 ID,且效能差。

最佳實踐總結

  • ID 欄位務必使用整數型別並設定 IDENTITY / AUTO_INCREMENT。
  • 應用層不要自行計算 MAX+1,交給資料庫保證唯一性與並發安全。
  • 若歷史資料已為字串,先建立新整數欄位遷移資料,再切換應用邏輯。
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved