Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

Гарантиран ли е редът при вмъкване на няколко реда с идентичност?

Много подобният въпрос беше зададен преди.

Можете да посочите 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 стойности, но техният относителен ред е гарантиран.

Ако не посочите ORDER BY в INSERT , след което се получава IDENTITY Идентификаторите могат да бъдат генерирани в различен ред.

Имайте предвид, че няма гаранция за действителния физически ред на редовете в таблицата дори с ORDER BY в INSERT , единствената гаранция са генерираните идентификатори.

Във въпрос INSERT INTO като SELECT с ORDER BY Умачандар Джаячандран от MS каза:

И той даде връзка към Поръчване гаранции в SQL Server , където Conor Cunningham от SQL Server Engine Team казва:

Има връзка към статия в базата знания на MS в коментарите в тази публикация:Поведението на функцията IDENTITY, когато се използва с SELECT INTO или INSERT .. SELECT заявки, които съдържат клауза ORDER BY , което го обяснява по-подробно. Пише:

Бих считал тази статия от БЗ за официална документация и смятам това поведение за гарантирано.



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. От какво зависи скоростта на заявка към базата данни и вмъкване?

  2. Как работи SET ROWCOUNT в SQL Server

  3. Разделете ред въз основа на стойност на колона

  4. Нивото на защита се промени по средата на проекта - сега проектът няма да се изгради

  5. Entity Framework поддържа ли ApplicationIntent=ReadOnly в низ за свързване на SQLClient