代码之家  ›  专栏  ›  技术社区  ›  Ville Koskinen

在SQL Server上自动增加层次ID

  •  0
  • Ville Koskinen  · 技术社区  · 16 年前

    考虑SQL Server上的此表

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

    WordID是可能有别名的单词的ID。aliasid确定单词的特定别名。

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

    我希望能够插入新单词,这些单词在表中没有任何别名,而无需首先查询表中的自由WordID值。插入值“hey”而不指定WordID或AliasID,将创建如下所示的行:

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

    这有可能吗?怎么可能?

    3 回复  |  直到 16 年前
        1
  •  1
  •   egrunin    16 年前

    我必须建立一个类似的东西,正常化将使你的生活 许多的 更容易的。Pseudocode:

    TABLE Word
        int WordID IDENTITY
        string reference_value /* just for debugging */
    
    TABLE Synonym
        int SynonymID IDENTITY
        int WordID
        string value
    
        2
  •  1
  •   James B    16 年前

    可能还有其他一些选项(SQL Server专家可能会对此有更多了解),但您有三个选项:

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

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

      对于一个新单词和别名

    我知道这两个问题都不能完全回答你的问题,而且都是非常糟糕的解决方案!…尽管我觉得我喜欢最后一个

        3
  •  1
  •   Jeff Hornby    16 年前

    似乎aliasid只用于区分具有相同wordid的记录。通常在这种情况下,数字从零开始并不重要。我只需在aliasid上放置一个标识列,它们在具有相同wordid的一组值中是唯一的。

    注意,如果顺序很重要(有时在这种情况下),这个解决方案会保持顺序。