我有一个使用 auniqueidentifier
作为聚集主键的 SQL Server 表。创建表并插入几行后,我重新启动了服务器。该列NEWSEQUENTIALID()
用作其默认值。
然而,在重新启动后,下一次插入创建了一个 GUID 值低于之前值的行,导致它出现在SELECT *
语句的顶部。
我的问题:在使用 GUID 类型的聚集主键时,有什么方法可以防止改组(AKA 保留行的顺序)?
我有一个使用 auniqueidentifier
作为聚集主键的 SQL Server 表。创建表并插入几行后,我重新启动了服务器。该列NEWSEQUENTIALID()
用作其默认值。
然而,在重新启动后,下一次插入创建了一个 GUID 值低于之前值的行,导致它出现在SELECT *
语句的顶部。
我的问题:在使用 GUID 类型的聚集主键时,有什么方法可以防止改组(AKA 保留行的顺序)?
如果要保证时间顺序,请添加一个名为 的列CreatedDate
,将其设置为不允许 NULL,并将默认设置为CURRENT_TIMESTAMP
。然后要获取最后 10 行,您可以说:
SELECT TOP 10 (*) FROM dbo.foo ORDER BY CreatedDate DESC;
这样你TOP
就有意义了。没有ORDER BY
,正如 marc 解释的那样,你TOP
的结果是没有意义的,虽然结果是相对可预测的(它们不是很随机,我更喜欢“任意”这个词),但它们不会有任何可靠性以相同的顺序排列他们被插入的顺序。无论您使用 GUID 还是整数作为主键都是如此 - 不能保证。
您永远无法保证订单保存NEWSEQUENTIALID()
,抱歉,这不是它的工作原理。
文档说它会生成一个新的 guid,保证在 windows 启动后最后一个完成之后。
在其中放置一个添加日期的列,用于订购,只需使用 newid 作为您的 guid。它不仅会起作用,还会为您提供更多信息,并且完全清楚正在发生的事情,更不用说它会使您的设计更便携。