Cómo crear una tabla con columna de identidad


111

Tengo una tabla existente que estoy a punto de volar porque no la creé con la IDcolumna configurada para ser la columna de identidad de la tabla.

Usando SQL Server Management Studio , escribí un script "Crear para ..." de la tabla existente y obtuve esto:

CREATE TABLE [dbo].[History](
    [ID] [int] NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] 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]

Mi pregunta es, ¿cómo modificaría esto SQLpara que mi tabla resultante tenga la IDcolumna configurada como Identidad ?


11
[ID] [int] NOT NULL IDENTITY (1,1)
Li0liQ

Respuestas:


153
CREATE TABLE [dbo].[History](
    [ID] [int] IDENTITY(1,1) NOT NULL,
    [RequestID] [int] NOT NULL,
    [EmployeeID] [varchar](50) NOT NULL,
    [DateStamp] [datetime] NOT NULL,
 CONSTRAINT [PK_History] 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]

1
Creo que eso es lo que estaba buscando. ¿No necesito cambiar el PK_Historyvalor a IDni nada?
jp2code

No, eso debería ser todo lo que necesita, PK_History es solo el nombre de la restricción que la restricción de clave principal ya está en el ID de columna
Gratzy

1
cuál es el significado de los parámetros IDENTIDAD (1,1)
otc

4
Identidad (semilla, incremento) docs.microsoft.com/en-us/sql/t-sql/statements/…
Gratzy

33

Esto ya ha sido respondido, pero creo que la sintaxis más simple es:

CREATE TABLE History (
    ID int primary key IDENTITY(1,1) NOT NULL,
    . . .

El índice de restricción más complicado es útil cuando realmente desea cambiar las opciones.

Por cierto, prefiero nombrar esa columna HistoryId, para que coincida con los nombres de las columnas en las relaciones de clave externa.


5
OP está trabajando específicamente con la salida de una herramienta GUI que genera el DDL para un objeto existente. Esa herramienta probablemente no tiene una opción de "usar una sintaxis más simple si es posible". El menos propenso a errores, para la situación específica de OP, sería editar una línea en el DDL generado y no intentar escribirlo desde cero usando la sintaxis más simple. Además, el ejemplo que dio no asigna un nombre a la restricción PK como OP tiene. Muchos prefieren mis restricciones nombradas para que tengan el mismo nombre en todos los entornos (dev, test, prod). ID int constraint PK_History primary key identity(1,1)Yo creo.
Shannon Severance

3
Tal vez tal vez no. He estado en situaciones en las que tomé el script de una base de datos, lo usé en otro servidor y los valores predeterminados que funcionaron en un lugar no eran los mejores para el otro. En cualquier caso, solo sugerí esto como una solución, ya que me parece más simple (personalmente entiendo la palabra clave "clave principal" mucho mejor de lo que entiendo las opciones en una restricción y considero usar opciones que no entiendo como "malas "). Sin embargo, hace un buen comentario acerca de por qué podría preferirse otra solución. Debo agregar, esa respuesta ya es la respuesta aceptada.
Gordon Linoff

@GordonLinoff: Compañero, la clave principal por defecto no es nula, ¿por qué necesita especificar explícitamente no nulo aquí?
Estudiante

@Learner. . . Ambas restricciones estaban en el código del OP. El NOT NULLes redundante.
Gordon Linoff

12
[id] [int] IDENTITY(1,1) NOT NULL,

por supuesto, dado que está creando la tabla en SQL Server Management Studio, puede usar el diseñador de tablas para establecer la Especificación de identidad.

ingrese la descripción de la imagen aquí


1
Bueno, gracias Phil. Sé cómo hacer eso, pero no puedo porque la mesa ya está allí. Tengo que eliminar la tabla y volver a crearla, por eso estoy usando el script.
jp2code

4
@ jp2code: quise decir que podría haber creado una tabla de prueba con una columna de Identidad y luego escribirla para ver cómo se debe especificar.
Phil

-2

La clave única permite un máximo de 2 valores NULL. Explicación:

create table teppp
(
id int identity(1,1) primary key,
name varchar(10 )unique,
addresss varchar(10)
)

insert into teppp ( name,addresss) values ('','address1')
insert into teppp ( name,addresss) values ('NULL','address2')
insert into teppp ( addresss) values ('address3')

select * from teppp
null string , address1
NULL,address2
NULL,address3

Si intenta insertar los mismos valores que a continuación:

insert into teppp ( name,addresss) values ('','address4')
insert into teppp ( name,addresss) values ('NULL','address5')
insert into teppp ( addresss) values ('address6')

Cada vez obtendrá un error como:

Violación de la restricción UNIQUE KEY 'UQ__teppp__72E12F1B2E1BDC42'. No se puede insertar una clave duplicada en el objeto 'dbo.teppp'.
La instrucción se ha terminado.


Necesitaba hacer que la IDcolumna fuera única , no la Namecolumna. ¿Por qué ha agregado la restricción única a la Namecolumna? ¿Cómo te beneficia eso en tu tepppmesa?
jp2code

1
En absoluto una respuesta a la Q aquí
Martin Smith
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.