首頁 > 資料庫 > mysql教程 > 如何使用 ROW_NUMBER() 在沒有識別列的情況下自動遞增資料?

如何使用 ROW_NUMBER() 在沒有識別列的情況下自動遞增資料?

DDD
發布: 2025-01-04 21:53:40
原創
859 人瀏覽過

How Can I Auto-Increment Data Without an Identity Column Using ROW_NUMBER()?

使用不含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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板