Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/81.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 手动或根据其他表格设置主ID的自动增量_Sql_Vb.net - Fatal编程技术网

Sql 手动或根据其他表格设置主ID的自动增量

Sql 手动或根据其他表格设置主ID的自动增量,sql,vb.net,Sql,Vb.net,我想我会问一个非常令人困惑的问题,所以我希望我能让你们明白这一点,所以,提前谢谢你们,如果这有点长,我很抱歉,因为我想确保我已经足够清楚了 我有两个相互依赖的表(在SQL 2005中)(让我们把它们命名为TableA和TableB)。它们都有相同的列,这意味着,所有TableA的列也都是TableB的列,只是TableA比TableB多了两列(后面将解释原因) 在我的应用程序(使用VB.Net创建)的“保存”过程中,那些具有column1和column2值的记录被插入到TableA中。但是,如果

我想我会问一个非常令人困惑的问题,所以我希望我能让你们明白这一点,所以,提前谢谢你们,如果这有点长,我很抱歉,因为我想确保我已经足够清楚了

我有两个相互依赖的表(在SQL 2005中)(让我们把它们命名为TableA和TableB)。它们都有相同的列,这意味着,所有TableA的列也都是TableB的列,只是TableA比TableB多了两列(后面将解释原因)

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

这两个表都有一个标识主键(自动递增+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从TableA设置了这个值,是的,仅从TableA设置,这导致了我的问题)

如果我保存了一条记录,其中包含column1和column2的值,则会将该记录插入TableA中,并将KeyID_a的值作为键。但是,如果我没有列1和列2的值,并且记录以KeyID_A的值作为键保存在TableB中,那么如果假定为TableA的下一个ID已经在TableB中使用,我将如何获取下一个ID(注意:
从TableA中选择nextID=MAX(KeyID_A)+1)?我希望根据TableA和TableB中的现有记录获取下一个ID,而不仅仅是基于TableA(因为我想,如果我已经将TableA的nextID用于TableB会怎么样(假设为“1001”,我想将另一条记录保存到TableB中,但显示的自动编号仍然是“1001”,因为它仅基于TableA的KeyID_A


如果可能的话,我真的不知道该怎么做。我希望我的问题说得足够清楚。

考虑对两个表使用一个序列器,或者如果你没有一个序列器,考虑使用“始终”

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

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

通常您不应该这样做

要么你做对了,就是: 解决方案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。

不清楚为什么要在两个表中复制数据。但是,可以使用1对1链接来处理给定的场景

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


这样,您将始终首先在
表格B
中插入数据,如果您在其他两列中有数据,那么您也将在
表格a
中插入一行,此时您将在
表格B
中插入ID,您将使用相同的ID。

您有多个用户在这两个表格中插入数据吗tly?我确定我只有一个用户。好吧,我建议添加第三个表(C)它只存储一条记录,即使用的最新id。当您在A或B中插入时,从该表中选择下一个id,保存数据并增加C中唯一记录的值。顺便说一下,如果这是一种您决定id然后从A和BOh中删除标识的情况……我明白了。我从未想过要创建一个新的表/视图以便t两个表只有一个主键源。我尝试嵌套IF-ELSE语句来测试该键是否已经存在于表B中,也许这就是我发疯的原因。然后我会发现解决方案非常简单。多亏了大家,您的答案非常有用。我将它们存储在单独的表中,因为它们不需要o有时可以单独检索。:-)如果单独检索是唯一的原因,为什么不使用视图来处理用户权限?