【问题标题】:Set auto-increment of primary ID manually or depending on another table手动或根据另一个表设置主 ID 的自动增量
【发布时间】:2014-05-21 09:10:55
【问题描述】:

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

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

在我的应用程序(使用 VB.Net 创建)的“保存”过程中,那些具有 column1 和 column2 值的记录被插入到 TableA 中。但是,如果 column1 和 column2 没有任何输入,则记录将保存在 Table2 中(这就是为什么 TableA 比 TableB 多两列的原因:具有 column1 和 column2 的记录进入 TableA,而那些没有的记录进入 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 FROM TableA 设置了这个,是的,仅来自 TableA,这导致了我的问题)。

如果我用 column1 和 column2 的值保存了一条记录,该记录将插入到 TableA 中,KeyID_A 的值作为键。但是,如果我没有 column1 和 column2 的值,并且记录以 KeyID_A 的值作为键保存在 TableB 中,我将如何获得下一个 ID(注意:SELECT nextID=MAX(KeyID_A)+1 FROM TableA)如果应该是下一个TableA 的 ID 已在 TableB 中使用?我想根据TableA和TableB的现有记录获取下一个ID,而不仅仅是基于TableA(因为我想,如果我已经为TableB使用了TableA的nextID(比如说'1001',我想要将另一条记录保存到 TableB 中,但出现的自动编号仍然是“1001”,因为它仅基于 TableA 的 KeyID_A。

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

【问题讨论】:

  • 您是否有多个用户同时在这两个表中插入数据?
  • 我确定我只有一个用户。
  • 好吧,我建议添加第三张表(C),它只存储一条记录,即使用的最新id。当您在 A 或 B 中插入时,从该表中选择下一个 id,保存数据并增加 C 中存在的唯一记录的值。顺便说一下,如果这是您决定 ID 的场景,则从 A 中删除 IDENTITY和乙
  • 哦...我明白了。我从来没有想过创建一个新的表/视图,以便两个表只有一个主键来源。我尝试的是嵌套 IF-ELSE 语句来测试该键是否已经存在于 TableB 中,也许这就是我发疯的原因。然后我会发现解决方案非常简单。谢谢大家,你们的回答很有帮助。

标签: sql vb.net


【解决方案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】:

    考虑为两张表使用一个排序器,或者如果您没有一个排序器,请考虑始终使用

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

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

    【讨论】:

      【解决方案3】:

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

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

      这样,你总是会先在TableB中插入数据,如果你在其他2列中有数据,那么你也会在TableA中插入一行,此时你将插入ID TableB,您将使用相同的 ID。

      【讨论】:

      • 我将它们存储在单独的表中,因为有时需要单独检索它们。 :-)
      • 如果单独检索是唯一的原因,为什么不使用视图来处理用户权限?
      猜你喜欢
      • 2015-12-22
      • 2010-12-01
      • 2010-10-31
      • 2012-08-29
      • 2019-11-28
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-02-08
      相关资源
      最近更新 更多