ホームページ >データベース >mysql チュートリアル >SQL Server 2005 で ROW_NUMBER() を使用して非 ID 列を自動インクリメントするにはどうすればよいですか?

SQL Server 2005 で ROW_NUMBER() を使用して非 ID 列を自動インクリメントするにはどうすればよいですか?

Patricia Arquette
Patricia Arquetteオリジナル
2024-12-27 01:10:10870ブラウズ

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

SQL Server 2005 での自動インクリメントに ORDER BY を使用せずに ROW_NUMBER() を使用する

SQL Server 2005 では、非ID 列は、ROW_NUMBER() と適切な ORDER BY 基準がない。ただし、代替案があります:

Constant Order By 句で ROW_NUMBER() を使用する:

有効な ORDER BY フィールドがありませんが、ROW_NUMBER() を次と組み合わせることができます。模倣する定数順序付け句自動インクリメント:

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

このメソッドは、ID 列の一意性を確保しながら、明示的な順序付けを回避します。

警告: 元の順序付けは保証されません:

このアプローチでは、元の SourceTable の順序の保持が保証されないことに注意することが重要です。外部クエリの ORDER BY などの他の要因は、結果の順序付けに影響を与える可能性があります。

同時実行性に関する考慮事項:

ロック ヒント (TABLOCKX および HOLDLOCK) は、クエリを使用して、同時プロセスがクエリ実行ステップ間で同じ ID を挿入するのを防ぎます。ただし、このアプローチは ID 列を使用するほど効率的ではないため、回避策としてのみ考慮してください。

推奨される解決策: ID 列を使用します:

最適なパフォーマンスと同時実行性を考慮して、自動インクリメントには ID 列を使用することを強くお勧めします。

以上がSQL Server 2005 で ROW_NUMBER() を使用して非 ID 列を自動インクリメントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。