執行以下腳本,該腳本可以創建表並將其填充到開發數據庫中。行爲不端身份
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SELECT * FROM dbo.Region
這是您期望從行爲良好的標識字段中獲得的輸出。
RegionId RegionName
----------- ------------------
1 Region One
2 Region Two
現在讓我們強制一些值進入標識列。
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-9, 'Unknown'),
(-99, 'N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SELECT * FROM dbo.Region
輸出是
RegionId RegionName
----------- ------------------
-9 Unknown
-99 N/A
2 Region One
3 Region Two
哪裏RegionId = 1去?
編輯在進一步的研究,SQL的服務器不跳過什麼,如果你嘗試同樣的特技兩次
SET NOCOUNT ON
Drop Table dbo.Region
GO
CREATE TABLE dbo.Region(
RegionId int IDENTITY(1,1),
RegionName varchar(100) NOT NULL
)
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-9, 'Unknown'),
(-99, 'N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region One'),
('Region Two');
GO
SET IDENTITY_INSERT dbo.Region ON;
INSERT INTO dbo.Region (RegionId, RegionName)
VALUES (-999, 'Known-Unknown'),
(-9999, 'Really N/A');
SET IDENTITY_INSERT dbo.Region OFF;
INSERT INTO dbo.Region (RegionName)
VALUES ('Region Four'),
('Region Five');
GO
SELECT * FROM dbo.Region
這裏的輸出是
RegionId RegionName
----------- ------------------
-9 Unknown
-99 N/A
2 Region One
3 Region Two
-999 Known-Unknown
-9999 Really N/A
4 Region Four
5 Region Five
在前面的情況下,1
失蹤。 4
這裏沒有失蹤!
所以現在這是不可預知的,失蹤的身份!
爲什麼RegionId = 1失蹤,但RegionId = 4沒有失蹤?
這是純粹的研究還是你真的需要1?我問,因爲普遍的共識是,如果你使用IDENTITY/AUTONUMBER,你會說「我實際上並不關心*實際*值是什麼,只要它是唯一的」。也就是說,你*要關心價值是什麼,但不足以確保它是一個特定的價值,你只需讓數據庫決定。 – 2011-06-16 19:59:22
我很確定我明白代理鍵是什麼以及如何使用標識字段。我不需要'1'。然而,正如你從我的兩個例子中無疑可以看出的那樣,這個例子變成了一個特例。我確實想知道它去了哪裏以及爲什麼。 – 2011-06-16 20:02:45
我同意,這是一個非常好的和有趣的問題! – 2011-06-16 20:04:17