Clave principal de incremento automático en SQL Server Management Studio 2012

447

¿Cómo hacer que auto incrementla primary keyde una SQL Servertabla de base, he tenido una mirada a través del foro, pero no puedo ver cómo.

He buscado las propiedades pero no puedo ver una opción, he visto una respuesta donde vas a la Identitypropiedad de especificación y la configuras en sí y la configura Identity incrementen 1, pero esa sección está atenuada y no puedo cambiar el no al si.

Debe haber una manera simple de hacer esto, pero no puedo encontrarlo.

Ledgemonkey
fuente
55
¿El tipo de datos de la columna clave es int?
Raab
1
@CoDe aDDict su conjunto actual como char (10) pero puedo cambiarlo ya que solo estoy practicando, gracias
Ledgemonkey

Respuestas:

704

Asegúrese de que el tipo de datos de la columna Clave sea inty luego configure la identidad manualmente, como muestra la imagen

ingrese la descripción de la imagen aquí

O simplemente ejecuta este código

-- ID is the name of the  [to be] identity column
ALTER TABLE [yourTable] DROP COLUMN ID 
ALTER TABLE [yourTable] ADD ID INT IDENTITY(1,1)

se ejecutará el código, si IDno es la única columna en la tabla

imagen de referencia fifo

Raab
fuente
21
Sólo un poco de corrección: La IDENTITYpropiedad podría ser aplicado a cualquier tipo de datos numéricos (lo que podría ser tinyint, smallint, int, bigint, numeric, decimal), la única restricción es que no podía representar número fraccionario (por lo que no puede ser float ni real, tampoco numeric, o decimal con escala distinta de cero ) y ofc, la especificación de identidad debe ser compatible con el tipo de datos seleccionado.
Pred
2
Trabajo, siempre que no haya claves extranjeras, etc.
Andrew Day
3
Solo quería agregar, si ya ha establecido un valor predeterminado en su columna de identidad, el (Is Identity) permanece atenuado. Elimine el valor predeterminado y estará disponible nuevamente.
CDspace
77
Si no puede modificar los valores, vaya a Herramientas-Opciones-Diseñadores y desmarque la opción "evitar guardar cambios que requieren una recreación".
Jaume
185

Cuando crea la tabla, puede crear una IDENTITYcolumna de la siguiente manera:

CREATE TABLE (
  ID_column INT NOT NULL IDENTITY(1,1) PRIMARY KEY,
  ...
);

La IDENTITYpropiedad incrementará automáticamente la columna desde el número 1. (Tenga en cuenta que el tipo de datos de la columna debe ser un número entero). Si desea agregar esto a una columna existente, use un ALTER TABLEcomando.

Editar:
Probado un poco, y no puedo encontrar una manera de cambiar las propiedades de Identidad a través de la ventana Propiedades de columna para varias tablas. Supongo que si quieres convertir una columna en una columna de identidad, DEBES usar un ALTER TABLEcomando.

Josien
fuente
Ah, esto es específicamente para SQL Server 2008 r2, no importa.
Josien
2
Esta sintaxis de crear tabla es una buena práctica, como lo aconseja el autor de esta publicación en los comentarios, la esperanza ayuda a alguien.
shaijut
88

Debe expandir la sección Identidad para exponer el incremento y la inicialización.

ingrese la descripción de la imagen aquí

Editar: supuse que tendría un tipo de datos entero, no char (10). Lo cual es razonable, diría, y válido cuando publiqué esta respuesta

gbn
fuente
2
El yesestá atenuado como está char(10)(del comentario recién publicado)
Martin Smith
@ Martin Smith sí, ese parece ser el problema general, voy a cambiar esto y probarlo, muchas gracias
Ledgemonkey
al crear una nueva tabla que utilicé BookID int primary key identity, no especifiqué tanto semilla como incremento, ¿es una buena práctica? porque veo documentación en MSDN Si no se especifica ninguno, el valor predeterminado es (1,1).
shaijut
40

Expanda su base de datos, expanda su tabla, haga clic derecho en su tabla y seleccione el diseño del menú desplegable. Se parece a esto

Ahora vaya a las propiedades de la columna a continuación, desplácese hacia abajo y encuentre la Especificación de identidad , amplíelo y encontrará ¿Es la identidad? Sí. Ahora elija Incremento de identidad justo debajo de él para dar el valor que desea incrementar en él. ingrese la descripción de la imagen aquí

FIFO BIZSOL
fuente
1
Esto parece ser la respuesta correcta para mí, solo hacer que el tipo de datos sea int no funcionaría, ¿verdad?
Drewdin
10

Tal vez me estoy perdiendo algo, pero ¿por qué esto no funciona con el objeto SECUENCIA? ¿No es esto lo que estás buscando?

Ejemplo:

CREATE SCHEMA blah.
GO

CREATE SEQUENCE blah.blahsequence
START WITH 1
INCREMENT BY 1
NO CYCLE;

CREATE TABLE blah.de_blah_blah
(numbers bigint PRIMARY KEY NOT NULL
......etc

Al hacer referencia a la secuencia en decir un comando INSERTAR simplemente use:

NEXT VALUE FOR blah.blahsequence

Más información y opciones para SECUENCIA

Techie Joe
fuente
Esta solución es la correcta si le importa el orden de tiempo de las filas insertadas, porque a IDENTITYveces salta dejando huecos y luego vuelve a llenar esos huecos nuevamente. Por IDENTITYlo tanto , no garantiza SIEMPRE la condición
incrmenet
1
@ Martin Smith ¡Vaya, no seguí el enlace, mi error! Me he acostumbrado tanto a que MS-SQL no tenga ciertas características que a veces olvido que hay versiones más nuevas que admiten más cosas. Eliminaré mi comentario ya que puede ser confuso ... Sin embargo, si se expresa de manera más general, sigue siendo válido: podría ser que está usando una marca / versión RDBMS que no admite objetos SECUENCIA, especialmente porque la pregunta se hizo solo un pocos meses después del lanzamiento de SQL Server 2012;)
Paul Groke
1
@FindOut_Quran ¿Está seguro de que los espacios en las columnas IDENTITY están llenos? Solo he trabajado con SQL Server 2005, donde nunca he visto que eso suceda, las brechas simplemente permanecen. Y me sorprendería ver que suceda en cualquier RDBMS porque dicha característica sería una combinación extraña de "no libre" (en cuanto al rendimiento) y "no deseable" (al menos en la mayoría de las aplicaciones).
Paul Groke
@PaulGroke Sí, estoy seguro. Puede intentar usar una transacción para insertar 1000 filas y luego deshacer. El valor de la idenetidad se mezclará. Intente insertar más miles de filas y confirmar / o revertir. Notará que a veces retrocede para llenar los vacíos
FindOut_Quran
@FindOut_Quran No puedo ver cómo podría suceder esto. Las columnas MS SQL IDENTITY usan un contador simple que se siembra en un valor definible por el usuario y luego se incrementa en un valor definible por el usuario. Incluso puede consultar y volver a configurar el contador. La única forma en que puedo ver que esto suceda es cuando las transacciones concurrentes se comprometen "fuera de servicio". Es decir, la transacción que primero topaba con el contador IDENTITY se confirma después de otra transacción. En ese caso, tendría una brecha de corta duración que luego se llena. Lo cual es necesario para evitar colisiones. Sin embargo, el contador de IDENTIDAD nunca habrá retrocedido.
Paul Groke
7

Cuando usa el Tipo de datos: int puede seleccionar la fila que desea aumentar automáticamente e ir a la etiqueta de propiedades de la columna. Allí puede establecer la identidad en 'sí'. El valor inicial para autoincremento también se puede editar allí. Espero poder ayudar;)

M.Schrecker
fuente
¿Dónde se encuentran las propiedades de la columna?
2

Tuve este problema en el que ya había creado la tabla y no podía cambiarla sin soltar la tabla, así que lo que hice fue: (No estoy seguro de cuándo implementaron esto, pero lo tuve en SQL 2016)

Haga clic derecho en la tabla en el Explorador de objetos:

Script Table as > DROP And CREATE To > New Query Editor Window

Luego haga la edición del guión dicho por Josien; desplácese hasta la parte inferior donde CREATE TABLEestá, encuentre su Clave primaria y agregue IDENTITY(1,1)hasta el final antes de la coma. Ejecutar guión.

El script DROP and CREATE también fue útil para mí debido a este problema. (Que maneja el script generado).

cheriejw
fuente
1

Tenga cuidado, como si desea que los elementos de ID sean contigius o no. Como SQLSERVER ID puede saltar en 1000.

Examen: antes de reiniciar ID = 11 después de reiniciar, inserte una nueva fila en la tabla, luego la identificación será 1012.

Java principal
fuente
1

Puede usar la palabra clave IDENTITYcomo tipo de datos para la columna junto con la PRIMARY KEYrestricción al crear la tabla.
ex:

StudentNumber IDENTITY(1,1) PRIMARY KEY

Aquí el primer '1' significa el valor inicial y el segundo '1' es el valor incremental.

Chanuka Naveen Koswatta
fuente
1
CREATE TABLE Persons (
    Personid int IDENTITY(1,1) PRIMARY KEY,
    LastName varchar(255) NOT NULL,
    FirstName varchar(255),
    Age int
);

El servidor MS SQL utiliza la palabra clave IDENTITY para realizar una función de incremento automático.

En el ejemplo anterior, el valor inicial para IDENTITY es 1, y se incrementará en 1 para cada nuevo registro.

Consejo: Para especificar que la columna "Personid" debe comenzar en el valor 10 e incrementarse en 5, cámbiela a IDENTITY (10,5).

Para insertar un nuevo registro en la tabla "Personas", NO tendremos que especificar un valor para la columna "Personid" (se agregará automáticamente un valor único):

Abd Abughazaleh
fuente
0

Si la tabla ya está poblada, no es posible cambiar una columna a la columna IDENTIDAD o convertirla a una columna sin IDENTIDAD. Debería exportar todos los datos, luego puede cambiar el tipo de columna a IDENTIDAD o viceversa y luego volver a importar los datos. Sé que es un proceso doloroso, pero creo que no hay alternativa, excepto el uso de la secuencia como se menciona en esta publicación.

Softec
fuente
1
Puede usar ALTER TABLE ... SWITCHpara cambiar los metadatos sin tener que tocar los datos. Por ejemplo, ¿cómo configurar el incremento automático después de crear una tabla sin pérdida de datos?
Martin Smith
1
El proceso mencionado en el enlace proporcionado por usted implica transferir los datos a la tabla temporal y viceversa, lo que está de acuerdo con mi declaración anterior. Si me equivoco, por favor deme un ejemplo de trabajo.
Softec
1
Hay un ejemplo de trabajo en el enlace. No hay "transferencia de datos a la tabla temporal y viceversa". `ALTER TABLE ... SWITCH` es un cambio de metadatos solamente. No mueve ningún dato.
Martin Smith