2008-09-20 19 views
97

Deseo 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 generar automáticamente los datos para ello.Agregue una columna a la tabla existente y úsela de manera única

Me gusta, 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, digamos, 1 a 1000. ¿Cómo hago eso?

+2

Esto va a ser específico de la base de datos. Debe especificar con qué base de datos está trabajando. – dvorak

+0

Estoy trabajando en SQL Server. –

+1

Debe editar su pregunta para mencionar eso. – dvorak

Respuesta

176

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) 
+5

Eso funcionó muy bien y agregó todos los números que necesitaba automáticamente. ¡Gracias! – djangofan

+7

Si tiene problemas para realizar cambios con la GUI de Management Studio puede cambiar la configuración en/Tools/Options/Designer/Table y Database Desiger encontrará la casilla 'Impedir guardar cambios que requieren la recreación de la tabla' desmarque esa casilla y usted podrá agregar una columna de identidad incluso con la GUI. – surfmuggle

+0

gracias por publicar –

4

Sólo mediante una tabla ALTER debería funcionar. Añadir la columna con el tipo adecuado y una bandera IDENTIDAD y debe hacer el truco

revisar este artículo de MSDN http://msdn.microsoft.com/en-us/library/aa275462(SQL.80).aspx sobre la sintaxis ALTER TABLE

+0

Gracias por la referencia al artículo. ¡De alguna manera nunca había leído sobre IDENTIDAD! –

0

Depende de la base de datos, ya que cada base de datos tiene una forma diferente para agregar secuencia números. Alteraría la tabla para agregar la columna y luego escribiría una secuencia de comandos 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 han establecido los datos, configure las claves principales correctamente.

10

para Oracle se podría hacer algo, como a continuación

alter table mytable add (myfield integer); 

update mytable set myfield = rownum; 
+0

Roy Tang: Eso fue de gran ayuda. ¡Gracias! – Abdul

19

Sería de gran ayuda si lo que usted envió base de datos SQL que está utilizando. Para MySQL es probable que desee AUTO_INCREMENT:

ALTER TABLE tableName ADD id MEDIUMINT NOT NULL AUTO_INCREMENT KEY

No estoy seguro si esto se aplica de manera retroactiva los valores embargo. Si no lo hace, debería poder iterar sobre sus valores con un procedimiento almacenado o en un programa simple (siempre que nadie más esté escribiendo en la base de datos) y configurar la función LAST_INSERT_ID() para generar el valor del id.

+6

También puedo confirmar que esto realmente funciona para MySQL; Acabo de agregar un campo de ID incremental a una tabla no indexada existente y cada fila obtuvo una nueva identificación única. –

+0

Disculpa, es una versión antigua, pero dice SQL server en el título. – Nick

+0

@Nick esta respuesta es útil para mí –

5

y el equivalente de Postgres (segunda línea es obligatoria sólo si desea "ID" como una clave):

ALTER TABLE tableName ADD id SERIAL; 
ALTER TABLE tableName ADD PRIMARY KEY (id); 
0

Si no desea que su nueva columna a ser de tipo IDENTITY (auto incremento), o si desea ser específico sobre el orden en que sus filas están numeradas, puede agregar una columna de tipo INT NULL y luego rellenarla de esta manera. En mi ejemplo, la nueva columna se llama MyNewColumn y la columna de la 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 más tarde, es decir, las versiones de que el apoyo ROW_NUMBER()

0

para UNIQUEIDENTIFIER tipo de datos en el servidor SQL probar este

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

Si desea crear la clave principal de esa columna use este

ALTER TABLE table_name 
ADD CONSTRAINT PK_name PRIMARY KEY (ID); 
Cuestiones relacionadas