使用不含ORDER BY 的ROW_NUMBER() 自動遞增資料
將資料插入到沒有識別列的表中時,有必要找到自動遞增主鍵的替代方法。一種常用的方法是 ROW_NUMBER() 函數,它允許對行進行順序編號。
傳統上,ROW_NUMBER() 函數需要 ORDER BY 子句來決定行的順序。但是,在某些情況下,合法的排序欄位不可用。為了解決這個問題,有一種解決方法,涉及在 ORDER BY 子句中使用任意常數表達式,例如 (SELECT 1)。
將此技術與OVER() 子句結合,可以計算每行的行號,而不指定特定順序:
Row_Number() OVER (ORDER BY (SELECT 1))
然後可以在INSERT 語句中使用此表達式來自動遞增主行key:
INSERT INTO dbo.TargetTable (ID, FIELD) SELECT Row_Number() OVER (ORDER BY (SELECT 1)) + Coalesce( (SELECT Max(ID) FROM dbo.TargetTable WITH (TABLOCKX, HOLDLOCK)), 0 ), FieldValue FROM dbo.SourceTable WHERE {somecondition};
但是,請務必注意,此解決方法不能保證保留SourceTable中行的原始順序。事實上,可能還有其他因素會影響結果的最終排序。這是因為「未排序(以特定方式)」與「保留原始順序」的概念不同。
因此,使用識別列進行主鍵自增通常被認為優於 ROW_NUMBER( )解決方法。它不僅消除了複雜計算的需要,還透過確保每一行都有唯一且不衝突的 ID 來提高並發性和資料完整性。
以上是如何使用 ROW_NUMBER() 在沒有識別列的情況下自動遞增資料?的詳細內容。更多資訊請關注PHP中文網其他相關文章!