azure table 存储自定义rowKey自增

azure table storage custom rowKey auto increment

我有一个天蓝色的 table 存储,我在其中使用自定义 "number" 作为 Rowkey(格式:YYYY-1XXXX),当我插入一个新项目时(通过 React js ajax Post 向我的 webApi 请求)将 1XXXX 部分增加 1?像这样:2017-10000 -> 下一个 ID 应该是 2017-10001.

没有。 Azure table 存储没有自动增加列值的方法。

为此,您需要在新实体中手动设置 RowKey,这反过来意味着您需要在保存之前知道先前实体的 RowKey 是什么。

它没有现成的支持,但有一种模式可以为具有相同分区键的实体执行您想要的操作。

首先从 max int 中减去您想要增加的行键,然后将该值用作您的行键。在同一个分区键中,此模式将导致 azure table 服务将最新插入的实体保留在 table 之上,因为在后端 azure table 以字典顺序存储实体.

接下来,当您想插入一个新实体时,只使用分区键和 Take(1) 进行查询,该查询将 return 您是最新插入的实体,没有任何 table扫描该分区(因为行键被反转)。

然后根据最新插入的实体的行键计算下一个行键并将新实体插入table存储。

在这个阶段可能会发生 2 件事,要么一切正常并且您在该分区键的 table 顶部插入了新实体,要么在您读取和插入其他人插入相同内容的时间之间实体已经具有相同的行键,在此阶段您将获得 http 状态代码 409 并简单地重复重试循环中的步骤。

根据您的情况,我建议您可以使用 Blob 存储作为存储最新自动增量值的中央存储,您需要 read/update 添加新项目时的值 table 存储。在 Azure Blob 存储中更新资源时使用乐观并发很简单,使用特定的先决条件和实体标记 (ETag) 来更新您的 blob,如果 blob 更改,ETag 也会更改,如果 ETag 不匹配,则HTTP Status Code 412 (Precondition failed) 会遇到,那么你可以重试并重新生成新值。

你可以参考这个blog for more details. Also, you could refer to here for the source code about BlobOptimisticSyncStore.cs and UniqueIdGenerator.cs. Additionally, here is a similar issue about Auto-increment on Azure Table Storage,你可以参考一下