Ejecute la siguiente secuencia de comandos que crea y rellena una tabla en su base de datos de desarrollo.La identidad que se porta mal
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
El resultado de esto es lo que cabría esperar de un campo de identidad con buen comportamiento.
RegionId RegionName
----------- ------------------
1 Region One
2 Region Two
Ahora forcemos un par de valores en la columna Identidad.
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
La salida es
RegionId RegionName
----------- ------------------
-9 Unknown
-99 N/A
2 Region One
3 Region Two
¿Dónde regionId = 1 ir?
Editar En la investigación adicional, SQL-Server no saltar nada si se intenta el mismo truco dos veces
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
La salida aquí es
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
En el caso anterior, el 1
desapareció. ¡Aquí el 4
no desapareció!
¡Así que ahora esta es la identidad impredecible y faltante!
¿Por qué el regionId = 1 go falta, pero el regionId = 4 no van a faltar ?!
¿Es esto para pura investigación o realmente necesitas el 1? Lo pregunto porque el consenso general es que si usa IDENTITY/AUTONUMBER está diciendo "realmente no me importa cuál es el valor * actual *, siempre que sea único". Es decir, si * te importa * cuál es el valor, pero no lo suficiente para asegurarte de que sea un valor específico, simplemente dejas que la base de datos decida. –
Estoy bastante seguro de que entiendo qué es una clave sustituta y cómo se usa un campo de Identidad. No necesito _necesita el '1'. Sin embargo, como sin duda ve en mis dos ejemplos, este se fue sin permiso. Quiero saber a dónde fue y por qué. –
Y estoy de acuerdo, ¡esa es una pregunta muy buena e interesante! –