手动或根据另一个表设置主ID的自动递增

时间:2014-05-21 09:10:55

标签: sql vb.net

我想我会问一个非常令人困惑的问题,所以我希望我能为你们清楚地表明这一点,所以,提前谢谢,如果这有点长,我很抱歉,因为我想制作确定我足够清楚。

我有两个表(在SQL 2005中),它们彼此依赖(让我们将它们命名为TableA和TableB。)它们具有所有相同的列,这意味着,所有TableA的列都是也是TableB的列,除了TableA有两列而不是TableB(稍后会解释为什么)。

在“拯救”中我的应用程序的过程(使用VB.Net创建),具有column1和column2值的记录将插入到TableA中。但是如果column1和column2没有任何输入,那么记录将保存在Table2中(这就是为什么TableA的列比TableB多两个:column1和column2的记录进入TableA,而那些没有进入TableA的记录进入TableA表B)。

两个表都有一个标识主键(自动递增+1,从1000开始),我们将其称为TableA的KeyID_A和TableB的KeyID_B,如果您已经可以想象该场景,则它们的密钥ID具有相同的值(TableA有一行,其中KeyID_A是' 1000',而TableB也有一行(一个不同的),其中KeyID_B是' 1000')。

在应用程序中,表单(输入TableA / TableB中的记录的位置)是自动编号的(我使用SELECT nextID=MAX(KeyID_A)+1 FROM TableA设置它,是的,仅来自TableA,这导致我的问题)

如果我保存了包含column1和column2值的记录,则记录将插入TableA中,并以KeyID_A的值作为键。但是,如果我没有column1和column2的值,并且记录以KeyID_A的值作为键保存在TableB中,我将如何获取下一个ID(注意:{{1}如果应该是TableA的下一个ID已经在TableB中使用过了?我希望根据TableA和TableB的现有记录得到下一个ID,而不仅仅是基于TableA(因为我想,如果我已经使用了TableA'对于TableB的nextID(让我们这样做)说' 1001',我想将另一条记录保存到TableB中,但出现的自动编号仍然是' 1001'因为它仅基于TableA的KeyID_A。

如果可能的话,我真的很困惑如何做到这一点。我希望我的问题足够清楚。

3 个答案:

答案 0 :(得分:1)

考虑在两个表中使用一个音序器,或者如果你没有想到总是使用

nextID = MAX(MAX(KeyID_A), MAX(KeyID_B)) + 1

此外,您的ID将是唯一的(非常好: - )

答案 1 :(得分:1)

通常你不应该这样做。

要么你做得对,那是: 解决方案1:

TableA
Id : int PK (identity)
col1
col2
...

TableB
Id: int PK FK on TableA.Id
col8
col9

并创建一个视图,让事情变得更简单。

解决方案2: 使用可为空的col8和col9创建表TableB 以及一个名为TableA的视图(如果需要)。

或错误的方式:

TableIdForAandB
Id : int PK identity

TableA
Id : int PK FK on TableIdForAandB.Id
col1
col2
...

TableB
Id : int PK FK on TableIdForAandB.Id
col1
col2
...
col8
col9

在这种情况下,您必须向表TableIdForAandB插入行,然后将行插入表TableA或TableB,并将Id设置为TableIdForAandB中的新Id。

答案 2 :(得分:0)

目前还不清楚为什么要在2个表格中复制数据。但是,您可以使用 1对1链接来处理您的给定方案。

您的TableB将是您的基表,其列数较少,TableA将是一个扩展表,但它不会包含已在TableB中的列,它将只有其他2列和主键。

通过这种方式,您将始终首先在TableB中插入数据,如果您有其他2列中的数据,那么您还将在TableA中插入一行,此时您将拥有在TableB中插入的ID,您将使用相同的ID。