比方說你有一個僱員表定義:
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])
希望這回答了你的問題。
如果ID列設置爲自動increament和主鍵,然後你不必爲它expcitly提供的價值。只需添加其他列的值,它會自動增加。在刪除任何記錄時,該ID也將被刪除,如果添加了新記錄,它將具有刪除後的下一個記錄的ID。比方說,如果你刪除ID 8並添加另一條記錄,它的ID將是9而不是8. –
[這可能會有所幫助](http://stackoverflow.com/questions/510121/reset-autoincrement-in-sql-server-後刪除)這個解決方案對我很有幫助。你試試 –
@YawarMurtaza是的,我設置了自動增量,但我在ID 8和ID 9中遇到了這個問題,如果我刪除ID 8,下一個ID 8不是ID 9。 –