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

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

Linda Hamilton
リリース: 2024-12-26 18:44:09
オリジナル
482 人が閲覧しました

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) が使用されます。

このアプローチでは順序の明示的な指定は回避されますが、そうではないことに注意することが重要です。ソーステーブルの元の順序が保持されることは保証されません。外部クエリの順序などの要因が結果に影響を与える可能性があります。データベースの観点から見ると、「元の順序を保持する」という概念は実際には存在しません。

最適な同時実行性とデータの整合性を確保するには、この回避策よりも ID 列の使用を強くお勧めします。絶対に必要な場合を除き、ロック ヒントによる排他的テーブル ロックは避けてください。

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

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート