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?


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)

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.


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;

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);


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);

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.


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()

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.