Una regla de oro que yo tengo en cuanto al diseño de tablas es que estas siempre deben tener como primary key una columna de tipo Identity. Esto nos ayuda a tener una llave primaria que sea corta, optimizada para la búsqueda y sin posibilidad de actualización. Sin embargo hace poco tiempo me encontré en una situación en la que una de las tablas más grandes una de las bases de datos que yo administro no tenía una llave Identity, sino que era una columna de tipo integer normal, y había un requerimiento de transformarla a Identity.

Si bien es cierto uno podría ir al SSMS y abrir la tabla en modo diseño para luego colocar la columna Id como Identity, pero… esto no es tan simple ya que si se hace de esta manera lo que hará tras bambalinas es que SSMS creara un script para crear una nueva tabla con la estructura que se desea, ósea con la columna Id como Identity, y luego pasara toda la data desde la tabla original a la nueva tabla, para finalmente eliminar la tabla original y renombrar la nueva tabla como la original. Como se ha descrito, son varios pasos e involucra un algo uso del Transaction Log dependiendo del tamaño de la tabla. Esto podría ser aceptable en el caso que la tabla no sea muy grande, sin embargo ese no era mi caso, entonces luego de revisar varios foros y paginas salió la solución que voy a describir a continuación, la cual no requiere la reconstrucción de la tabla, sino que hace uso de un comando propio de particionamiento de tablas para poder lograr el objetivo.

Para poder mostrar el ejemplo vamos a crear una tabla a la que agregaremos 1 millon de registros, esta tabla tendrá tres columnas, la columna Id será de tipo entero pero no Identity.

Ahora para poder convertir la columna Id a Identity debemos crear otra tabla que sea un espejo en estructura a mi tabla “BigTable”, pero esta nueva tabla si tendrá la columna Id como Identity

Seguidamente aplicaremos el comando que hace que toda la magia sea posible, literalmente este comando es el que te salvara de incontables minutos viendo como tu tabla se reconstruye, tu Transaction Log crece y tus preocupaciones de si es que algo sale mal tendrás que tener tu tabla bloqueada por más tiempo.

Finalmente debemos eliminar la tabla original y renombrar la nueva para que tenga el nombre de la tabla original y las aplicaciones y otros objetos la sigan referenciando sin ningún problema.

Como se puede observar el proceso es bastante sencillo y te permitirá ahorrar muchísimo tiempo y dolores de cabeza. En caso la tabla a modificar tenga relaciones (FKs) con otras tablas estas deberán ser eliminadas previas a la eliminación de la tabla original, y reconstruidas luego del renombrado de la tabla nueva.