テーブルに複数の行を挿入する場合、指定した順序で行が入るという保証はありますか?たとえば、次のようにします。
DECLARE @blah TABLE
(
ID INT IDENTITY(1, 1),
Name VARCHAR(100) NOT NULL
);
INSERT INTO @blah (Name)
VALUES('Timmy'),
('Jonny'),
('Sally');
SELECT * FROM @blah
Sally
より高い主キーを持つ保証はありますTimmy
か?
非常によく似た質問が以前に尋ねられました。
あなたは指定することができますORDER BY
ではINSERT
。
これを行うと、IDENTITY
値が生成される順序がで指定さORDER BY
れたものと一致することが保証されますINSERT
。
あなたの例を使用して:
DECLARE @blah TABLE
(
ID INT IDENTITY(1, 1) NOT NULL,
Name VARCHAR(100) NOT NULL
);
INSERT INTO @blah (Name)
SELECT T.Name
FROM
(
VALUES
('Timmy'),
('Jonny'),
('Sally')
) AS T(Name)
ORDER BY T.Name;
SELECT
T.ID
,T.Name
FROM @blah AS T
ORDER BY T.ID;
結果は次のとおりです。
+----+-------+
| ID | Name |
+----+-------+
| 1 | Jonny |
| 2 | Sally |
| 3 | Timmy |
+----+-------+
つまり、Name
この順序に従ってソートされ、IDが生成されています。ジョニーが最低のIDを持ち、ティミーが最高のIDを持ち、サリーがそれらの間にIDを持つことが保証されます。生成されたID値の間にギャップがある可能性がありますが、それらの相対的な順序は保証されています。
指定しない場合ORDER BY
ではINSERT
、その結果のIDENTITY
IDが異なるために発生することができます。
断っておくが、でもとのテーブル内の行の実際の物理的な順序のための保証はありませんORDER BY
でINSERT
、唯一の保証は生成されたIDです。
質問の中で、MSのUmachandarJayachandranによるORDERBYでSELECTとしてINSERTINTOは次のように述べています。
唯一の保証は、ID値がORDERBY句に基づいて生成されることです。ただし、テーブルへの行の挿入順序は保証されません。
そして、彼はSQLServerの注文保証へのリンクを提供しました。SQLServerEngineTeamのConorCunninghamは次のように述べています。
- SELECTとORDERBYを使用して行にデータを入力するINSERTクエリは、ID値の計算方法を保証しますが、行が挿入される順序は保証しません。
その投稿のコメントには、MSナレッジベースの記事へのリンクがあります。SELECTINTOまたはINSERTで使用した場合のIDENTITY関数の動作..ORDERBY句を含むSELECTクエリ。詳細を説明しています。それは言う:
句
IDENTITY
の順序に従って値を順番に割り当てる場合ORDER BY
は、IDENTITY
プロパティを含む列を含むテーブルを作成してINSERT ... SELECT ... ORDER BY
から、クエリを実行してこのテーブルにデータを入力します。
私はこのKB記事を公式ドキュメントと見なし、この動作が保証されていると見なします。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加