【问题标题】:Avoid primary key duplicates in Windows Azure避免 Windows Azure 中的主键重复
【发布时间】:2012-09-08 20:00:22
【问题描述】:

在 Windows Azure 表存储中,没有允许 ID 自动递增的“类型”。我以为我可以使用“IsIdentity”,但复选框是灰色的(这应该让我自动递增,对吧?)。

谁能告诉我如何获得自动递增字段或解决方法?

谢谢!

【问题讨论】:

    标签: sql azure unique


    【解决方案1】:

    除非出于某种原因,您实际上需要单调递增的数字键,否则使用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,所以你可能在那里没问题。

    另外请记住,对于负载平衡等,如果两台服务器同时创建一条记录,您获得重复记录的可能性非常小,因此您应该使用重试语义来增加键值减一。

    【讨论】:

    • 我不了解 PartitionKey 业务...本质上(据我了解)我使用 DateTime.Utc.Now.ToString() 并将其作为字符串存储在我的数据库中(作为主要键),对吧?顺便说一句,谢谢您的幽默回答!
    • DateTime.UtcNow.Ticks.ToString() - Ticks 属性很重要。
    • 我更喜欢(DateTime.MaxValue - DateTime.UtcNow).Ticks.ToString("d19") 按时间倒序排列。无论哪种方式,d19 技巧都很方便。见blog.smarx.com/posts/using-numbers-as-keys-in-windows-azure。也有一点幽默。
    • +1 表示“如果您想避免 Y3160 错误”。如果 3160 的 Eartians 因为这个 bug 不能使用我的应用程序,那就太可惜了。
    猜你喜欢
    • 2021-04-05
    • 1970-01-01
    • 2023-01-13
    • 1970-01-01
    • 2014-03-29
    • 2017-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多