2017-03-20 12 views
0

但如果在ID列做這個設置,我將面臨的另一個問題是這樣的畫面:open this picture

  • 現在如何讓ID列在刪除任何行後變成自動計數?

所以我想我應該做一個循環,以增加每個新記錄的ID值的新數字。 並在每個刪除行中統計ID列以重置ID列中的號碼列表。

我想我的想法現在已經很清楚了。所以任何幫助,使其工作。我正在使用C#。

+0

如果ID列設置爲自動increament和主鍵,然後你不必爲它expcitly提供的價值。只需添加其他列的值,它會自動增加。在刪除任何記錄時,該ID也將被刪除,如果添加了新記錄,它將具有刪除後的下一個記錄的ID。比方說,如果你刪除ID 8並添加另一條記錄,它的ID將是9而不是8. –

+0

[這可能會有所幫助](http://stackoverflow.com/questions/510121/reset-autoincrement-in-sql-server-後刪除)這個解決方案對我很有幫助。你試試 –

+0

@YawarMurtaza是的,我設置了自動增量,但我在ID 8和ID 9中遇到了這個問題,如果我刪除ID 8,下一個ID 8不是ID 9。 –

回答

0

比方說你有一個僱員表定義:

CREATE TABLE [dbo].[Employee](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [FirstName] [varchar](50) NULL, 
    [LastName] [varchar](50) NULL, 
    [DateOfBirth] [datetime] NULL, 
    [SequenceNumber] [int] NOT NULL, 
    [DateTimeStamp] [datetime] NOT NULL, 
CONSTRAINT [PK_Employee] PRIMARY KEY CLUSTERED 
(
    [Id] ASC 
)WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, ALLOW_PAGE_LOCKS = ON) ON [PRIMARY] 
) ON [PRIMARY] 

GO 

SET ANSI_PADDING OFF 
GO 

ALTER TABLE [dbo].[Employee] ADD CONSTRAINT [DF_Employee_DateTimeStamp] DEFAULT (getdate()) FOR [DateTimeStamp] 
GO 

ID設置主鍵和自動遞增。 SequenceNumber專欄是我們感興趣的專欄。它將按照您的要求順序保存。當添加新記錄時,DateTimeStamp也被設置爲當前日期時間 - 僅用於保存日誌。

現在我們有一個存儲過程,將增加一個新的僱員記錄:

CREATE PROCEDURE spAddNewEmployee 
       @FirstName AS VARCHAR(50), 
       @LASTNAME AS VARCHAR(50), 
       @DATEOFBIRTH AS DATETIME    
    AS 
    BEGIN 
     -- SET NOCOUNT ON added to prevent extra result sets from 
     -- interfering with SELECT statements. 
     SET NOCOUNT ON; 

     -- Insert statements for procedure here 

    DECLARE @LAST_SEQUENCE_NUMBER AS INT; 

    SELECT @LAST_SEQUENCE_NUMBER = MAX([SequenceNumber]) FROM dbo.Employee 

    IF(@LAST_SEQUENCE_NUMBER IS NULL) 
    BEGIN 
     SET @LAST_SEQUENCE_NUMBER = 1; 
    END 
    ELSE 
    BEGIN 
     SET @LAST_SEQUENCE_NUMBER = @LAST_SEQUENCE_NUMBER + 1 

    END 


    INSERT INTO dbo.Employee 
    (
      [FirstName] 
      ,[LastName] 
      ,[DateOfBirth] 
      ,[SequenceNumber]  
    ) 
    VALUES 
    (
     @FirstName, 
     @LastName, 
     @DateOfBirth, 
     @LAST_SEQUENCE_NUMBER 
    ) 
    END 
    GO 

如果它不是空(這將是在第一個記錄將被添加)它將檢索最後SequenceNumber附加價值就會1到它。接下來,該記錄將與自動字段DateTimeStamp一起添加。

到目前爲止這麼好。現在讓我們去刪除員工的一部分,這裏是員工刪除存儲過程:

CREATE PROCEDURE [dbo].[spDeleteEmployee] 
       @EmployeeId AS INT 
AS 
BEGIN 
    -- SET NOCOUNT ON added to prevent extra result sets from 
    -- interfering with SELECT statements. 
    SET NOCOUNT ON; 

    -- Insert statements for procedure here 

    DECLARE @DELETED_SEQUENCE_NUMBER AS INT, @LAST_SEQUENCE_NUMBER AS INT; 

    SELECT @LAST_SEQUENCE_NUMBER = MAX([SequenceNumber]) FROM dbo.Employee 
    SELECT @DELETED_SEQUENCE_NUMBER = [SequenceNumber] FROM dbo.Employee WHERE ID = @EMPLOYEEID 

    DELETE FROM dbo.Employee 
    WHERE ID = @EMPLOYEEID 

    WHILE(@DELETED_SEQUENCE_NUMBER <= @LAST_SEQUENCE_NUMBER) 
    BEGIN 
     UPDATE dbo.Employee 
     SET SequenceNumber = @DELETED_SEQUENCE_NUMBER 
     WHERE SequenceNumber = @DELETED_SEQUENCE_NUMBER + 1 

     SET @DELETED_SEQUENCE_NUMBER = @DELETED_SEQUENCE_NUMBER + 1 
    END 


END 

GO 

爲了保持SequenceNumber不斷增量第一,我們正在最後一個序列號和要刪除的一個。然後在刪除記錄後,我們循環遍歷刪除的記錄之後的每條記錄,並對齊SequenceNumber,直到達到記錄的結尾,即循環條件爲止。

爲了使它更好,您可以使用事務來封裝整個操作。

編輯:您還可以SequenceNumber列獨特:

ALTER TABLE [dbo].[Employee] ADD CONSTRAINT UQ_SequenceNumber UNIQUE ([SequenceNumber]) 

希望這回答了你的問題。

+0

我們發現它對於審計目的非常有用。它允許我們查看哪些記錄是在什麼時間添加的,以便我們可以根據需要查看最近的記錄。 –

+0

非常感謝你我的朋友,但是很抱歉,我不擅長SQL編程,並且在C#中新增了一些內容,我可以理解你的代碼,但是我不知道如何在sql中完成,並在代碼上進行一些更改。 我想我會去找某人並向他展示你的代碼,也許他會幫我把它設置在我的程序中。 非常感謝你。 –

0

在我看來,如果你只是想在GridView中顯示連續的數字,你不需要擔心底層的自動遞增主鍵。

您可以使用<%# Container.DataItemIndex + 1 %>來顯示該序號。

請看下面的例子:

<asp:GridView ID="GridView1" runat="server" AutoGenerateColumns="False" > 
<Columns> 
     <asp:TemplateField HeaderText="#"> 
      <ItemTemplate> 
       <%# Container.DataItemIndex + 1 %> 
      </ItemTemplate> 
      <ItemStyle Font-Bold="false" /> 
     </asp:TemplateField> 
     <asp:BoundField DataField="FirstName" HeaderText="FirstName"></asp:BoundField> 
     <asp:BoundField DataField="LastName" HeaderText="LastName"></asp:BoundField> 
</Columns> 
</asp:GridView> 
相關問題