在表中插入多行时,是否可以保证它们按照我指定的顺序进入?例如,请采取以下措施:
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.保证Jonny将拥有最低ID,Timmy将拥有最高ID,Sally将拥有他们之间的ID.生成的ID值之间可能存在间隙,但保证了它们的相对顺序.
如果没有指定ORDER BY
的INSERT
,则导致IDENTITY
在不同的顺序生成的ID.
请注意,即使使用ORDER BY
in ,也无法保证表中行的实际物理顺序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文章视为官方文档,并认为此行为得到保证.