当前位置:  开发笔记 > 数据库 > 正文

插入具有标识的多行时是否保证订单?

如何解决《插入具有标识的多行时是否保证订单?》经验,为你挑选了1个好方法。

在表中插入多行时,是否可以保证它们按照我指定的顺序进入?例如,请采取以下措施:

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



1> Vladimir Bar..:

之前曾问过非常相似的问题.

您可以指定ORDER BYINSERT.

如果你这样做,其中的顺序IDENTITY生成值是保证符合规定ORDER BYINSERT.

使用你的例子:

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 BYINSERT,则导致IDENTITY在不同的顺序生成的ID.

请注意,即使使用ORDER BYin ,也无法保证表中行的实际物理顺序INSERT,唯一的保证是生成的ID.

在一个问题INSERT INTO作为SELECT与ORDER BY来自MS的Umachandar Jayachandran说:

唯一的保证是将根据ORDER BY子句生成标识值.但是无法保证将行插入表中的顺序.

他给出了SQL Server中Ordering保证的链接,SQL Server Engine Team的Conor Cunningham说:

    使用SELECT和ORDER BY来填充行的INSERT查询保证了如何计算标识值,但不保证插入行的顺序

在该帖子的评论中有一个指向MS知识库文章的链接:与SELECT INTO或INSERT一起使用时IDENTITY函数的行为.包含ORDER BY子句的SELECT查询,更详细地解释了它.它说:

如果希望按照子句中IDENTITY的排序顺序分配值ORDER BY,请创建一个包含具有该IDENTITY属性的列的表,然后运行INSERT ... SELECT ... ORDER BY查询以填充此表.

我会将此KB文章视为官方文档,并认为此行为得到保证.

推荐阅读
wurtjq
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有