首頁 >資料庫 >mysql教程 >如何在 SQL Server 2005 中自動遞增非識別列而不在 ROW_NUMBER() 中使用 ORDER BY?

如何在 SQL Server 2005 中自動遞增非識別列而不在 ROW_NUMBER() 中使用 ORDER BY?

Linda Hamilton
Linda Hamilton原創
2024-12-26 18:44:09483瀏覽

How Can I Auto-Increment a Non-Identity Column in SQL Server 2005 Without Using ORDER BY in ROW_NUMBER()?

避免在SQL Server 2005 ROW_NUMBER() 中使用ORDER BY

將資料從一個表插入另一個表時,通常需要自動遞增目標表中的非識別列。雖然可以使用 ROW_NUMBER() 函數來實現此目的,但它通常需要 ORDER BY 欄位。但是,如果必須保留來源表的原始順序,則需要找到替代方法。

避免明確排序的解決方案涉及以下程式碼:

INSERT 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};

此程式碼利用視窗函數根據常數值計算行號,有效地取代了對 ORDER BY 子句的需要。此外,為了防止並發問題,查詢在計算目標表中的最大值時採用鎖定提示(TABLOCKX 和 HOLDLOCK)。

需要注意的是,雖然此方法避免明確指定順序,但它並沒有t 保證源表的原始順序將被保留。外部查詢順序等因素仍會影響結果。從資料庫的角度來看,「保留原始順序」的概念並不真正存在。

為了獲得最佳並發性和資料完整性,強烈建議使用識別列而不是此解決方法。除非絕對必要,否則應避免透過鎖定提示進行獨佔表鎖定。

以上是如何在 SQL Server 2005 中自動遞增非識別列而不在 ROW_NUMBER() 中使用 ORDER BY?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn