【问题标题】:Autoincrementing hierarchical IDs on SQL Server在 SQL Server 上自动递增分层 ID
【发布时间】:2011-01-31 15:19:19
【问题描述】:

考虑 SQL Server 上的这个表

wordID    aliasID    value
===========================
0         0          'cat'
1         0          'dog'
2         0          'argh'
2         1          'ugh'

WordID 是一个可能有别名的词的 id。 AliasID 确定单词的特定别名。

所以上面的 'argh' 和 'ugh' 是彼此的别名。

我希望能够在表中插入没有任何别名的新词,而不必先在表中查询空闲 wordID 值。在不指定 wordID 或 aliasID 的情况下插入值“hey”,将创建如下所示的行:

wordID    aliasID    value
===========================
3         0          'hey'

这可能吗?如何实现?

【问题讨论】:

  • 最初我以为这是关于HIERARCHYID 数据类型的问题。该死的:(

标签: sql sql-server identity hierarchical-data auto-increment


【解决方案1】:

可能还有其他一些选项(sql server 专家可能会对此有所了解),但您有以下三个选项:

  1. 在插入时定义一个触发器以更新表中的值(糟糕!)
  2. 将您的表规范化为单独的单词表和别名表,每个表都有自己的标识列作为其 ID
  3. 将您的插入语句重组为类似于以下内容的内容;

    insert into aliases( select <your new alias>, max(aliasId)+1, max(wordId) +1 from aliases)

    换一个新词和别名

我知道这些都不能完全回答你的问题,而且都是非常糟糕的解决方案!...虽然我认为我喜欢最后一个

【讨论】:

  • 谢谢。我其实很喜欢你的标准化想法。如果 aliasID 是单独表中的标识列和 words 表的外键(而不是每个 wordID 的序号),事情可能非常简单。
【解决方案2】:

我必须构建一个类似的东西,标准化将使您的生活更加更轻松。伪代码:

TABLE Word
    int WordID IDENTITY
    string reference_value /* just for debugging */

TABLE Synonym
    int SynonymID IDENTITY
    int WordID
    string value

【讨论】:

    【解决方案3】:

    看起来 aliasID 仅用于区分具有相同 WordID 的记录。通常在这种情况下,数字从零重新开始并不重要。我只想在 aliasID 上放置一个标识列,它们在具有相同 WordID 的值集中是唯一的。

    请注意,如果顺序很重要(有时是这样的情况),此解决方案会保留顺序。

    【讨论】:

      猜你喜欢
      • 2015-07-05
      • 2015-05-25
      • 2012-01-13
      • 2018-08-06
      • 1970-01-01
      • 1970-01-01
      • 2017-03-24
      • 1970-01-01
      • 2014-12-05
      相关资源
      最近更新 更多