【发布时间】:2016-04-09 20:07:47
【问题描述】:
在表中插入多行时,是否可以保证它们按我指定的顺序插入?例如,采取以下措施:
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?
【问题讨论】:
-
既然你在使用身份,为什么这很重要?您正在有效地使用随机(尽管是可预测的)数字。我很确定它们会按指定的顺序插入,但这真的重要吗?
-
是的,这很重要。这是我能想出的最简单的问题形式,但在“现实世界”场景中,我正在输出身份,并在其他地方使用它们。
-
你永远不应该使用这样的标识列。如果您需要保证数字遵循某种可预测的序列,那么您应该明确生成该序列。您不是在寻找身份列,而是在寻找在数据库中具有某种业务意义的东西,您应该定义该含义并为其提供服务。
-
如果您要在其他地方使用分配的标识值,那么您应该使用 OUTPUT 子句。这样您就可以 100% 确定哪个标识值与输入值中的哪一行匹配。
-
您似乎依赖于跨多个表的身份属性值来保持同步。这是非常脆弱的。让身份发挥作用并利用该价值。试图估计它可能会导致重大问题。
标签: sql sql-server sql-server-2012