Tenemos una tabla de 5 GB (casi 500 millones de filas) y queremos eliminar la propiedad de identidad en una de las columnas, pero cuando intentamos hacer esto a través de SSMS, se agota el tiempo de espera.
¿Se puede hacer esto a través de T-SQL?
sql
sql-server
tsql
Conrad Jagger
fuente
fuente
Respuestas:
No puede eliminar una
IDENTITY
especificación una vez establecida.Para eliminar toda la columna:
Información sobre ALTER TABLE aquí
Si necesita conservar los datos, pero eliminar la
IDENTITY
columna, deberá:IDENTITY
columna existente a la nueva columnaIDENTITY
columna existente .fuente
identity
columna se usa como parte de unaforeign key
en otra tabla, primero tendrá que eliminar las restricciones, luego tomar medidas como @AdamWenger mencionó sobre la eliminación de la identidadattribute/property
... También puede consultar este enlace para obtener más detalles sobre eliminar solo el atributo: blog.sqlauthority.com/2009/05/03/… .. ¡Buena suerte!Si desea hacer esto sin agregar y completar una nueva columna , sin reordenar las columnas y casi sin tiempo de inactividad porque no hay datos cambiando en la tabla, hagamos un poco de magia con la funcionalidad de particionamiento (pero como no se utilizan particiones, no debe hacerlo) no necesita edición Enterprise):
ALTER TABLE [Original] SWITCH TO [Original2]
exec sys.sp_rename
para cambiar el nombre de los diversos objetos de esquema a los nombres originales, y luego puede recrear sus claves foráneas.Por ejemplo, dado:
Puedes hacer lo siguiente:
fuente
Esto se complica con las restricciones de clave principal y externa, así que aquí hay algunos scripts para ayudarlo en su camino:
Primero, cree una columna duplicada con un nombre temporal:
A continuación, obtenga el nombre de su restricción de clave principal:
Ahora intente eliminar la restricción de clave principal para su columna:
Si tiene claves foráneas, fallará, por lo que, si es así, elimine las restricciones de claves foráneas. ¡MANTENGA LA PISTA DE LAS TABLAS PARA LAS QUE FUNCIONA ESTO PARA QUE PUEDE AGREGAR LAS RESTRICCIONES MÁS TARDE!
Una vez que se hayan eliminado todas las restricciones de clave externa, podrá eliminar la restricción PK, soltar esa columna, cambiar el nombre de su columna temporal y agregar la restricción PK a esa columna:
Finalmente, agregue las restricciones FK nuevamente en:
El Fin!
fuente
Select t.name 'Table', i.name 'Index', c.name 'Column', i.is_primary_key, i.is_unique From sys.tables t Inner Join sys.indexes i On i.object_id = t.object_id Inner Join sys.index_columns ic ON ic.object_id = i.object_id And i.index_id = ic.index_id Inner Join sys.columns c ON ic.object_id = c.object_id and ic.column_id = c.column_id Where t.name = 'tableName' Order By t.name, i.name, i.index_id, ic.index_column_id
Acabo de tener este mismo problema. 4 declaraciones en SSMS en lugar de usar la GUI y fue muy rápido.
Hacer una nueva columna
alter table users add newusernum int;
Copiar valores sobre
update users set newusernum=usernum;
Suelta la columna vieja
alter table users drop column usernum;
Cambie el nombre de la nueva columna al nombre de la columna anterior
EXEC sp_RENAME 'users.newusernum' , 'usernum', 'COLUMN';
fuente
El siguiente script elimina el campo de identidad para una columna llamada 'Id'
Espero eso ayude.
fuente
El siguiente código funciona bien cuando no conocemos el nombre de la columna de identidad .
Necesita copiar datos en una nueva tabla temporal como
Invoice_DELETED
. y la próxima vez que usemos:Para obtener más explicaciones, consulte: https://dba.stackexchange.com/a/138345/101038
fuente
Sin embargo, el código anterior solo funciona si no hay una relación de clave primaria-externa
fuente
Solo para alguien que tiene el mismo problema que yo. Si solo desea hacer una inserción solo una vez, puede hacer algo como esto.
Supongamos que tiene una tabla con dos columnas.
y desea insertar una fila con el ID = 4. Entonces, vuelva a colocarla en 3 para que la siguiente sea 4
Hacer el inserto
Y devuelva su semilla a la ID más alta, supongamos que es 15
¡Hecho!
fuente
Tenía el mismo requisito, y podría intentarlo de esta manera, que personalmente le recomiendo, diseñe manualmente su tabla y genere el script, y lo que hice a continuación fue cambiar el nombre de la tabla anterior y también su restricción para la copia de seguridad.
fuente
En SQL Server puede activar y desactivar la inserción de identidad de esta manera:
SET IDENTITY_INSERT table_name ON
- ejecuta tus consultas aquí
SET IDENTITY_INSERT table_name OFF
fuente