2011-03-29 95 views
0

假設我有這樣的問題與自動增量在SQL

ID Name 
1 RJ 
2 Hello 
3 NV 
4 Dere 
5 What 

所以,當我用這條SQL語句

從數據庫中刪除(ID = 4和名稱=上真)的第四個條目表
Delete from Table where ID="4" 

則刪除的錶行,但是當我看到表在我看來作爲

ID Name 
1 RJ 
2 Hello 
3 NV 
5 What 

那麼,有沒有辦法THA t將其像我想的表,只要我刪除該表的第四個條目

ID Name 
1 RJ 
2 Hello 
3 NV 
4 What 

樣子,這也將自動更新自動遞增ID希望你已經認識了我的問題.. !!

+5

你能解釋爲什麼* *你想要的行爲? – adrianbanks 2011-03-29 19:47:26

+1

不要重新編號你的主鍵,這隻會給你帶來很多麻煩。 (我找不到自動增量除了創建主鍵的任何其他很好用) – 2011-03-29 19:48:34

+0

另外,請不要不僅企業案例/使用情況/問題,你正在試圖解決,但還有具體的平臺。自動編號不是一般的ANSI SQL概念,並且有許多SQL實現。如果一個人通常發佈「SQL」,我們通常假設SQL Server,但是這對於這裏的人來說可能非常混亂,因爲知識淵博的SQL用戶熟悉幾個平臺以及其中的差異。 – 2011-03-29 19:51:18

回答

4

號這將涉及潛在的更新數十萬條記錄。你的代碼不應該要求密鑰是連續的。你永遠不應該假設關鍵。

+0

感謝您解釋這個概念。是的,你是對的...我感到困惑...真的很感謝。 – ferhan 2011-03-29 20:01:37

4

那不是IDENTITY /自動編號列的。

如果你需要一個動態的列數(基於什麼樣的順序?),使用一些動態的,不是一個普通的舊數據列。

例如,你可以只擺脫ID列,並添加CreationDate()日期時間列默認爲GETDATE

SELECT * 
    ,ROW_NUMBER() OVER (ORDER BY CreationDate) AS ID 
FROM tbl 
+0

不知何故,您的默認RDBMS似乎是SQL Server。 :) – 2011-03-29 20:14:39

+0

@Andriy M它是。儘管我現在在Oracle中花更多時間。 SQL Server對於新手來說非常容易和流行的一個問題是他們傾向於將其縮寫爲SQL,尤其是在Stack Overflow上。 – 2011-03-29 20:25:24

+0

我在這裏遇到過這樣的人。到目前爲止還沒有注意到這是一種趨勢,但將來會更加關注。感謝您分享您的觀察。 – 2011-03-29 20:34:31

0

它是身份普通SQL行爲。

+1

請注意,IDENTITY列不一定是PRIMARY KEY。 – 2011-03-29 19:52:23

+0

沒錯。這是我的小姐,對不起 – 2011-03-29 19:53:29

+0

它往往是一個PK和聚集也只是想指出,它不一定是。您認爲差距行爲是一致的和必要的 - 即使簡單的中止交易(身份「用盡」)也會發生。 – 2011-03-29 19:56:49

1

DECLARE @Id詮釋
組@id = 4
從表中刪除,其中ID = @ ID

更新表
設置ID = ID - 1
WHERE ID> @ID

但不這樣做此

+0

感謝您解釋這個概念。是的,你是對的...我感到困惑...真的很感謝。 – ferhan 2011-03-29 20:01:57

1

原諒這一點,但爲什麼呢?這只是一個數字,並且沿着道路是很可能你會有其他表格通過ID來引用這個表格。這就是DB最擅長的。不要擔心編號。

+0

感謝您解釋這個概念。是的,你是對的...我感到困惑...真的很感謝。 – ferhan 2011-03-29 20:00:49