【发布时间】:2012-09-08 20:00:22
【问题描述】:
在 Windows Azure 表存储中,没有允许 ID 自动递增的“类型”。我以为我可以使用“IsIdentity”,但复选框是灰色的(这应该让我自动递增,对吧?)。
谁能告诉我如何获得自动递增字段或解决方法?
谢谢!
【问题讨论】:
在 Windows Azure 表存储中,没有允许 ID 自动递增的“类型”。我以为我可以使用“IsIdentity”,但复选框是灰色的(这应该让我自动递增,对吧?)。
谁能告诉我如何获得自动递增字段或解决方法?
谢谢!
【问题讨论】:
除非出于某种原因,您实际上需要单调递增的数字键,否则使用DateTime.UtcNow.Ticks.ToString() 是通常的方法。 (因为Table Storage上的PartitionKey值是字符串,所以需要转换一下。)
这种方法的优点是表存储行自动按 PartitionKey(然后按 RowKey)排序,因此您可以按照插入的顺序重新获取行,就像 SQL Server 中的 IDENTITY 列.
如果您希望最近返回的记录最先返回,请改用(long.MaxValue - DateTime.UtcNow.Ticks).ToString()。
请注意,第一种方法将给出未来 1158 年的 18 位数字。如果您想避免 Y3160 错误,请考虑使用前导零 (DateTime.UtcNow.Ticks.ToString("0000000000000000000")) 填充该值。
第二种方法确实会在很长一段时间内给出一个 19 位数字,远远超过 DateTime.MaxValue,所以你可能在那里没问题。
另外请记住,对于负载平衡等,如果两台服务器同时创建一条记录,您获得重复记录的可能性非常小,因此您应该使用重试语义来增加键值减一。
【讨论】:
DateTime.UtcNow.Ticks.ToString() - Ticks 属性很重要。
(DateTime.MaxValue - DateTime.UtcNow).Ticks.ToString("d19") 按时间倒序排列。无论哪种方式,d19 技巧都很方便。见blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure。也有一点幽默。