创建唯一的顺序(非PK)数据库值

时间:2016-09-19 13:21:56

标签: .net vb.net

我有一张包含产品编号的表格。每个artikel属于一些产品。当用户创建他的产品时,新的号码被生成。取决于具有特定数字的producent articel开头,然后在整数的第二部分中新的数字增加1。示例如下所示:

Producent: X (12 as start number)
12.1001.1
12.1002.1
12.1003.1

Producent: Y (4 as start number)
4.1001.1
4.1002.1
4.1003.1
4.1004.1
4.1005.1
4.1006.1

我在windows窗体上有向导,下一个/后退按钮用户选择产品并生成数字 - 我的意思是有sql查询正在寻找已经可用于特定产品的最高数量,例如对于Producent Y next将是4.1006.1,因此新号码将为4.1007.1。在应用程序获得下一个数字的那一刻,这个数字不会插入到表中,但是在用户必须完成几个不同的事情之后。此时,此数字将保存到变量中,以便在进程结束时插入所有其他内容之后插入。

问题是当其他用户为同一产品创建他的文章时,他的向导会给他与前一个用户相同的号码,因为所提到的号码仍然不在表中,所以他得到的号码与之前的用户相同。

您将如何解决此问题?我想到的是在db中有额外的表,所以当生成新的数字时,它将转到该表,除了生成他的数字之外的每个其他用户也会检查新表是否存在数字并再次递增它。当然,每个用户下班后完成应用程序都会从​​此条目中清除该表。我在这里想到的一个问题是,如果出于某种原因,任何应用程序将被错误或其他任何内容关闭,那么该表将不会清除该条目。

你会怎么做我的身边?

1 个答案:

答案 0 :(得分:1)

有很多我们不知道的:哪个数据库?,如何从​​数据库中存储和读取数据?如何存储东西(如1个字符串或3个整数)?

因此,这是一个概念解决方案。如果这些必须是唯一的和顺序的,那么除非并且直到将其保存到DB,否则无法确定该值。如果允许序列间隙,则可以更轻松 - 您可以在未保存记录时刻录值。如果您的数据库支持触发器,则访问计数器表会很浪费。在MySQL中使用一个简单的表:

{ID int(11), Name (varchar), Descr (varchar), Major (int), Minor (int), Revision (int)}

如果您将其存储为一个字符串值,您可能需要重新考虑它 - 单独它们具有意义并且也被这样操纵,因此它们是不同的数据元素。您可以在SQL中轻松地对它们进行CONCAT,或者将它们转换为代码中的System.Version类型。添加前插入触发器:

BEGIN
    SET @maxR = 0;
    SET @maxR = (SELECT Max(Minor) FROM jamversion WHERE Major = NEW.Major);
    If (ISNUll(@maxR)) THEN 
        SET @maxR = 1000;
    END IF;
    SET NEW.Minor = @maxR + 1;
END

您可能需要添加LOCK,但我们甚至不知道数据库是什么。

您的代码不会传递Minor值,db会提供它。使用SQL和ExecuteNonQuery添加行必须获取记录以查看使用的值。使用DataTableDataAdapter可以刷新。快速测试:

enter image description here

我添加了100行,每行有1到5之间的随机Major值。按主要排序时:

次要值是唯一的 按顺序递增次数
Id也按次序递增,表示插入的订单匹配

在其他情况下,在插入记录之前,您可以使用存储过程插入新行,并从传递的某些值创建"X.YYYY.Z"字符串值。也许DBNull或-1是创建与上述类似的段的指令。然后返回该值以进行插入。