sql >> データベース >  >> RDS >> Sqlserver

ID を使用して複数の行を挿入する場合、順序は保証されますか?

    非常によく似た 質問

    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 が生成されました。 Jonny が最も低い ID、Timmy が最も高い ID、Sally がそれらの間の ID を持つことが保証されています。生成された ID 値の間にギャップがある場合がありますが、それらの相対的な順序は保証されています。

    ORDER BY を指定しない場合 INSERT で 、結果の IDENTITY ID は別の順序で生成できます。

    ORDER BY を使用しても、テーブル内の行の実際の物理的な順序は保証されません。 INSERT で 、唯一の保証は生成された ID です。

    質問 ORDER BY を使用した SELECT としての INSERT INTO MS の Umachandar Jayachandran は次のように述べています。

    そして、彼は 注文へのリンクを提供しましたSQL Server での保証 、SQL Server Engine Team の Conor Cunningham は次のように述べています。

    その投稿のコメントに、MS ナレッジ ベース記事へのリンクがあります: SELECT INTO または INSERT で使用する場合の IDENTITY 関数 .. ORDER BY 句を含む SELECT クエリ で詳しく説明しています。それは言う:

    この KB 記事を公式ドキュメントと見なし、この動作が保証されていると考えます。



    1. 繰り返し処理できるアイテムのオフセットが可変である場合、「次の」イベントを取得するにはどうすればよいですか?

    2. 複数の行を連結する

    3. OracleCBLOBからXML値を抽出できません

    4. フラグメントでAndroidSqliteデータベースを開く