Agregue una columna a la tabla existente y numere de forma exclusiva en MS SQL Server

121

Quiero agregar una columna a una base de datos heredada existente y escribir un procedimiento mediante el cual pueda asignar a cada registro un valor diferente. Algo así como agregar una columna y autogenerar los datos para ella.

Por ejemplo, si agrego una nueva columna llamada "ID" (número) quiero inicializar un valor único para cada uno de los registros. Entonces, mi columna de ID tendrá registros de say 1 to 1000.
¿Cómo puedo hacer eso?

Adhip Gupta
fuente
2
Esto va a ser específico de la base de datos. Debe especificar con qué base de datos está trabajando.
dvorak
1
Debería editar su pregunta para mencionar eso.
dvorak

Respuestas:

221

Esto dependerá de la base de datos, pero para SQL Server, esto podría lograrse de la siguiente manera:

alter table Example
add NewColumn int identity(1,1)
Simon Johnson
fuente
55
Eso funcionó a la perfección y agregó todos los números que necesitaba automáticamente. ¡Gracias!
djangofan
9
Si tiene problemas para realizar cambios con la interfaz gráfica de usuario de Management Studio, puede cambiar la configuración en / Herramientas / Opciones / Diseñador / Tabla y Desiger de base de datos. Encontrará una casilla de verificación Prevent saving changes that require table re-creationdesmarque esa casilla y podrá agregar una columna de identidad incluso utilizando el gui
surfmuggle
22

Sería útil si publicaras qué base de datos SQL estás usando. Para MySQL probablemente desee auto_increment:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

Sin embargo, no estoy seguro si esto aplica los valores retroactivamente. Si no es así, debería poder iterar sobre sus valores con un procedimiento almacenado o en un programa simple (siempre y cuando nadie más esté escribiendo en la base de datos) y establecer el uso de la LAST_INSERT_ID()función para generar el valor de identificación.

Tom Martin
fuente
77
También puedo confirmar que esto realmente funciona para MySQL; Acabo de agregar un campo de identificación incremental a una tabla no indexada existente y cada fila obtuvo una nueva identificación única.
Doug Kavendek
Lo siento, es uno viejo pero decía servidor SQL en el título.
Nick
11

para Oracle podrías hacer algo como a continuación

alter table mytable add (myfield integer);

update mytable set myfield = rownum;
Roy Tang
fuente
8

Y el equivalente de Postgres (la segunda línea es obligatoria solo si desea que "id" sea una clave):

ALTER TABLE tableName ADD id SERIAL;
ALTER TABLE tableName ADD PRIMARY KEY (id);
Flavien Volken
fuente
3

para el tipo de datos UNIQUEIDENTIFIER en el servidor sql intente esto

Alter table table_name
add ID UNIQUEIDENTIFIER not null unique default(newid())

Si desea crear una clave principal a partir de esa columna, use esto

ALTER TABLE table_name
ADD CONSTRAINT PK_name PRIMARY KEY (ID);
Snziv Gupta
fuente
0

Depende de la base de datos, ya que cada base de datos tiene una forma diferente de agregar números de secuencia. Alteraría la tabla para agregar la columna y luego escribiría un script db en groovy / python / etc para leer los datos y actualizar la identificación con una secuencia. Una vez que se hayan establecido los datos, agregaría una secuencia a la tabla que comienza después del número superior. Una vez que se hayan configurado los datos, configure las claves principales correctamente.

Joshua
fuente
0

Si no desea que su nueva columna sea de tipo IDENTITY(incremento automático), o si desea ser específico sobre el orden en que se numeran sus filas, puede agregar una columna de tipo INT NULLy luego completarla de esta manera. En mi ejemplo, la nueva columna se llama MyNewColumn y la columna de clave principal existente para la tabla se llama MyPrimaryKey.

UPDATE MyTable
SET MyTable.MyNewColumn = AutoTable.AutoNum
FROM
(
    SELECT MyPrimaryKey, 
    ROW_NUMBER() OVER (ORDER BY SomeColumn, SomeOtherColumn) AS AutoNum
    FROM MyTable 
) AutoTable
WHERE MyTable.MyPrimaryKey = AutoTable.MyPrimaryKey  

Esto funciona en SQL Sever 2005 y versiones posteriores, es decir, versiones que admiten ROW_NUMBER()

Jinlye
fuente