postgresql 如何在表中进行连续的id编号?

0yg35tkg  于 2024-01-07  发布在  PostgreSQL
关注(0)|答案(1)|浏览(138)

我正在使用EF Core与Postgres数据库进行C#项目。我需要将序列化数据从数据库发送到消息代理。数据将在每个月的特定时间发送。例如,有100条数据记录,它们今天发送。这些数据记录将具有cID(连续ID)从1到100。下个月,这100条记录将再次发送。但是然后cID应该从101到200开始。
这就是它应该的样子


的数据
下面是一个示例模型:

[Table("institutions")]
public partial class Institution
{
    public Institution()
    {
        InstitutionResources = new HashSet<InstitutionResource>();
    }

    [Key]
    [Column("id")]
    public int Id { get; set; }
    public int AddressId { get; set; }
    [Column("phone")]
    [StringLength(20)]
    public string Phone { get; set; }
    [Column("email_address")]
    [StringLength(255)]
    public string EmailAddress { get; set; }
    [ForeignKey(nameof(AddressId))]
    [InverseProperty("Institutions")]
    public virtual Address Address { get; set; }
    [InverseProperty(nameof(InstitutionResource.Institution))]
    public virtual ICollection<InstitutionResource> InstitutionResources { get; set; }
}

字符串
到目前为止,我已经给table编号了:

public List<InstitutionDataResult> FormInstitutionDataResult()
 {
     long cID = 1; // Here I want cID was continuous
     var institutions = _dbContext.Institutions
         .Select(s => new InstitutionDataResult
         {
             //CID = there should be an id
             Id = s.Id, // it is an id from the table
             NameKk = s.InstitutionResources.Where(l => l.LanguageId == 1).SingleOrDefault().Name,
             NameRu = s.InstitutionResources.Where(l => l.LanguageId == 2).SingleOrDefault().Name,
             Geoposition = s.Address.Geoposition.ToString(),
             Phone = s.Phone,
             Email = s.EmailAddress,
             Date = DateTime.Now.ToString("dd.MM.yyyy")
         }).ToList();
     // 
     foreach (var institution in institutions)
     {
         institution.CID = cID;
         cID++;
     }
     return crosswalks;
 }


有人暗示我可以使用postgres序列,但我不知道如何使用它们

djp7away

djp7away1#

在实体框架中,默认情况下,long Id属性将被解释为主要的自动递增键。零值将被解释为一个新对象,该对象将在保存时分配一个新的ID。
您可以手动指定特定的ID,但如果不小心,这可能会扰乱数据库的内部序列。
但是你不应该对自动生成的值做任何具体的假设,除了唯一性,并且可能随时间单调增加。如果你需要Id有一些特殊的关系,比如batch 1有1-100,batch 2有101-200,你可能更好地明确表达这种关系,例如,通过使用单独的Id和BatchId字段。如果需要,您可以将它们合并组合成一个复合键。我不是数据库Maven,但我可能会使用内部主自动递增键,并对来自外部源的任何数据使用(复合)代理键。只要确保清楚地标记列,这样你就不会混淆在不同上下文中使用的ID。

相关问题