ORDER BY を使用せずに ROW_NUMBER() を使用してデータを自動インクリメントする
ID 列のないテーブルにデータを挿入する場合、次のことが必要になります。主キーを自動インクリメントするための代替方法を見つけてください。一般的に使用されるアプローチの 1 つは、行に連続番号を付けることができる 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 の行の元の順序の保持を保証するものではないことに注意することが重要です。実際、結果の最終的な順序に影響を与える他の要因が存在する可能性があります。これは、「(特定の方法で) 順序付けされていない」という概念が「元の順序を保持する」とは異なるためです。
したがって、主キーの自動インクリメントに ID 列を使用することは、一般に ROW_NUMBER( ) 回避策。これにより、複雑な計算の必要性がなくなるだけでなく、各行に一意で競合しない ID が確実に割り当てられるため、同時実行性とデータの整合性も向上します。
以上がROW_NUMBER() を使用して ID 列なしでデータを自動インクリメントするにはどうすればよいですか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。