2014-03-24 66 views
3

我有一個SQL表用戶。它有3列id(設置爲主要和身份爲是),名稱和密碼。當我向表中輸入數據時,id變大了。但在刪除查詢時,只有名稱和密碼將被刪除。我需要刪除包含id的特定行。 例如:如何用主鍵ID刪除一行?

id:1 name:abc password:123 
id:2 name:wer password:234 
id:3 name:lkj password:222 
id:4 name:new password:999 

我需要刪除第三列即ID:3名:密碼LKJ:222。但是在刪除這一行之後,表格應該如下所示。

id:1 name:abc password:123 
id:2 name:wer password:234 
id:3 name:new password:999 
+4

你是說從the_table是'刪除其中id = 42'沒有刪除該行? –

+1

你可以發佈你的刪除查詢 –

+3

猜測,你是否期待你剛剛刪除的'id'值在你插入新行時再次變得可用?如果是這樣,那不是'身份'字段的工作方式。一旦使用了一個數字,它就消失了(沒有與表格混在一起)。 – Tony

回答

1

從您提供的附加信息可以看出,您不明白IDENTITY數據類型。包括我自己在內的其他人表示,數字不會被重複使用。

您還應該避免僅僅因爲行被刪除而改變主鍵。

這似乎你需要一個行號,不要使用此鍵。創建使用ROW_NUMBER功能的視圖,類似

SELECT ROW_NUMBER() OVER (Order by id) AS row_number, name, password, ... 
FROM [Your_Table] 
1

正如@Tony所說,一旦使用了一個數字,它就不再可用了。解決此問題的方法如下:
1.根本不使用標識字段。只使用設置爲主鍵的整數字段。
2.聲明每當插入新行時觸發的觸發器。
3.此觸發器必須讀取表中最後一個插入行的ID,並將其加1並將結果插入ID字段中。
因此,稍後刪除此行時,該ID再次可用。

+2

這樣做的問題是,你絕對會殺死任何這樣做的表現。如果沒有大量的鎖定,沒有辦法做到這一點 - 並且在絕大多數情況下,需要這個ID字段是一個設計錯誤。這對於用戶/密碼錶來說可能很好,但對於更多的事務活動表來說,它將成爲死亡緩慢的一塊,因爲對錶的所有訪問都必須被序列化。 – TomTom

+0

@TomTom對於每個解決方案都有一些優點和缺點。最後,你不能回滾身份字段。如果你想擁有這個價值,你根本不用它們。這只是解決問題的一種方式,但它有其缺點:性能和維護。您必須查看您在應用程序和數據庫中處理的具體情況。然後你可以決定哪種解決方案適合你。 –

1

如果您想稍後重用該ID,那是一個非常糟糕的主意。不要走那條路。要做到這一點的唯一方法是性能問題,或者在有競爭條件時很容易出錯。畢竟,udntities不重用值有一個原因。無論如何,ID應該沒有意義。除個人偏​​好之外,通常沒有理由不能跳過價值觀。但個人偏好不應該優於性能和可靠性。如果你想要這樣做,因爲你討厭跳過的值,那就不要。如果你從上面得到這個要求,然後推回去。告訴他們,替代方案更耗時,更不可靠,並且更可能導致數據完整性問題。