2010-03-25 102 views
0

分层标识考虑的SQL Server自动递增的SQL Server

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

在此表中的wordID是可能有别名单词的ID。别名ID确定一个单词的特定别名。

因此,上面'argh'和'ugh'是彼此的别名。

我希望能够在表中插入没有任何别名的新单词,而无需先查询表中的空白wordID值。插入值“嗨”而不指定的wordID或aliasID,一排看起来像这样将创建:

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

这是可能的,如何?

+1

最初我以为这是一个关于'HIERARCHYID'数据类型的问题。该死的:( – Codesleuth 2010-03-25 09:35:01

回答

1

我不得不建立一个类似的东西,并且规范化会让你的生活更容易。伪代码:

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

TABLE Synonym 
    int SynonymID IDENTITY 
    int WordID 
    string value 
1

可能有一些其他的选择(和一个SQL Server专家也许能够揭示出这个更多的光线),但三个选项,你必须是:

  1. 定义,在更新值插入时的触发表(!呸)
  2. 正常化你的表为单独的单词和别名表的每个为他们的ID
  3. 调整你的INSERT语句是沿着线的东西自己的身份列;

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

    新词和别名

据我所知,这些都不完全回答你的问题,所有的都相当惨的解决方案!...虽然我觉得我喜欢最后其中一个是全部

+0

)我真的很喜欢你的规范化想法,如果aliasID是一个单独的表中的标识列和单词表的外键(而不是每个wordID的序列号),事情可能非常简单。 – 2010-03-25 12:28:41

+0

好的,很高兴我能帮上忙! – 2010-03-25 12:49:44

1

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

请注意,如果订单很重要(因为它有时会出现这种情况),此解决方案可保留订单。