2010-03-25 78 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的一組值中是唯一的。

請注意,如果訂單很重要(因爲它有時會出現這種情況),此解決方案可保留訂單。