【问题标题】:What is the best way to avoid duplication of data避免数据重复的最佳方法是什么
【发布时间】:2020-08-07 07:49:14
【问题描述】:

保存用户后,我将以下代码发送给generate series number。但是我的问题是如果系统的用户同时保存(many user)它有可能有重复的序列号。

  public string GenerateSeriesNumber(string code, Entities db, string Ctrl)
    {
        string year = DateTime.Now.Year.ToString().Substring(2);

        string prev_ctrls = "";
        var tbl = db.SeriesTable.Where(a => a.SeriesNo.Contains(Ctrl)).OrderByDescending(a => a.SeriesNo);
        foreach (var item in tbl.ToList())
        {
            string[] current_srs = item.SeriesNo.Split('-');
            if (prev_srs == "")
                prev_srs = item.SeriesNo;

            int aaa = Convert.ToInt32(prev_srs.Split('-')[3]);
            int bbb = Convert.ToInt32(current_srs[3]);
            if (aaa < bbb)
                prev_srs = item.SeriesNo;

        }
        string Series_No = "";

        if (tbl != null)
        {
            string[] LastSeries_No = prev_srs.Split('-');
            if (LastSeries_No.Length == 4)
            {
                LastSeries_No[3] = Int32.Parse(LastSeries_No[3]) + 1 + "";
                for (int i = LastSeries_No[3].Length; i < 7; i++)
                {
                    LastSeries_No[3] = "0" + LastSeries_No[3];
                }
                LastSeries_No[1] = code.ToUpper();
                Series_No = String.Join("-", LastSeries_No);
                return Series_No;
            }
        }
       
        return Series_No;
    }

我尝试在我的 SQL (I am using SQL Server 2017) 中执行此操作,但其中一个遇到错误并且没有保存

ALTER TABLE dbo.SeriesTable
ADD CONSTRAINT UC_LT UNIQUE (SeriesNo);

【问题讨论】:

  • 一种选择是创建一个唯一索引,当抛出异常时只生成另一个数字。
  • @user743414 我试过了,遇到错误。返回到我的 Javascript 后,我​​再次调用该函数进行保存。但不幸的是,其中一个遇到了上述错误。
  • 您的表中可能已经有重复的数据 - 您应该解决重复的行并重新创建约束或添加 WITH NOCHECK 。如果长度不是问题,您可以在密钥末尾添加一个 new_id()
  • @Mitz 抱歉回复晚了。如果他们同时保存数据,唯一会遇到重复数据的时间。如上所述

标签: c# sql-server


【解决方案1】:

为了避免数据重复,可以使用不同的方法:

  • 标识列(不适合序列键)
  • NEWID() - 见here
  • 一个序列

在你的情况下,我会使用 NEWID(),或者只是一个序列号并在数字之间添加破折号('-')。

附言如果有其他要求迫使您以某种方式使序列号增加或有意义,您应该将它们包含在问题中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-10-10
    • 2011-01-12
    • 2019-08-23
    • 2014-12-15
    • 2011-01-14
    相关资源
    最近更新 更多