sql-server - una - eliminar columna sql
¿Cómo eliminar una columna de una tabla existente? (9)
En SQL Server 2016 puedes usar nuevas sentencias DIE.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
La consulta anterior se puede volver a ejecutar, se drops
la columna solo si exists
en la tabla, de lo contrario no generará un error.
En lugar de usar envoltorios de IF
grandes para verificar la existencia de la column
antes de soltarla, simplemente puede ejecutar la instrucción DDL
anterior
¿Cómo eliminar una columna de una tabla existente?
Tengo una mesa MEN
con Fname
y Lname
Necesito quitar el Lname
¿Cómo hacerlo?
Esta es la respuesta correcta:
ALTER TABLE MEN DROP COLUMN Lname
Pero ... si existe una CONSTRAINT
en la COLUMN
, primero debes DROP
la CONSTRAINT
, luego podrás DROP
la COLUMN
. Para soltar un CONSTRAINT
, ejecute:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Esto también se puede hacer a través de la GUI de SSMS. Lo bueno de este método es que le advierte si hay alguna relación en esa columna y también puede eliminarlas automáticamente.
- Coloque la tabla en la vista Diseño (haga clic con el botón derecho en la tabla) de esta forma:
- Haga clic derecho en la columna en la vista Diseño de la tabla y haga clic en "Eliminar columna"
Como dije antes, si hay alguna relación que también deba ser eliminada, en este punto le preguntaremos si desea eliminarlas también. Es probable que tenga que hacerlo para eliminar la columna.
Genérico:
ALTER TABLE table_name DROP COLUMN column_name;
En tu caso:
ALTER TABLE MEN DROP COLUMN Lname;
La pregunta es, ¿solo puedes eliminar una columna de una tabla inexistente ;-)
BEGIN TRANSACTION
IF exists (SELECT * FROM sys.columns c
INNER JOIN sys.objects t ON (c.[object_id] = t.[object_id])
WHERE t.[object_id] = OBJECT_ID(N''[dbo].[MyTable]'')
AND c.[name] = ''ColumnName'')
BEGIN TRY
ALTER TABLE [dbo].[MyTable] DROP COLUMN ColumnName
END TRY
BEGIN CATCH
print ''FAILED!''
END CATCH
ELSE
BEGIN
SELECT ERROR_NUMBER() AS ErrorNumber;
print ''NO TABLE OR COLUMN FOUND !''
END
COMMIT
La respuesta simple a esto es usar esto:
ALTER TABLE MEN DROP COLUMN Lname;
Más de una columna se puede especificar de esta manera:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
Desde SQL Server 2016 también es posible quitar la columna solo si existe. Esto evita que obtengas un error por algo que probablemente no te importe.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Hay algunos requisitos previos para eliminar columnas. Las columnas caídas no pueden ser:
- Utilizado por un índice
- Usado por las restricciones CHECK, FOREIGN KEY, UNIQUE, o PRIMARY KEY.
- Asociado con un DEFAULT
- Atado a una regla
Si alguno de los anteriores es cierto, primero debe eliminar esas asociaciones.
Además, debe tenerse en cuenta que al eliminar una columna no se recupera el espacio del disco duro hasta que se reconstruye el índice agrupado de la tabla. Como tal, a menudo es una buena idea seguir lo anterior con un comando de reconstrucción de tabla como este:
ALTER TABLE MEN REBUILD;
Finalmente, como algunos han dicho, esto puede ser lento y probablemente bloqueará la tabla por la duración. Es posible crear una nueva tabla con la estructura deseada y luego cambiar el nombre de esta manera:
SELECT
Fname
-- Note LName the column not wanted is not selected
INTO
new_MEN
FROM
MEN;
EXEC sp_rename ''MEN'', ''old_MEN'';
EXEC sp_rename ''new_MEN'', ''MEN'';
DROP TABLE old_MEN;
Pero tenga en cuenta que hay una ventana para la pérdida de datos de las filas insertadas entre el primer comando de selección y el último cambio de nombre.
Para agregar columnas en la tabla existente:
ALTER TABLE table_name
ADD
column_name DATATYPE NULL
Para eliminar columnas en la tabla existente:
ALTER TABLE table_name
DROP COLUMN column_name
Su ejemplo es simple y no requiere ningún cambio de tabla adicional, pero en general no es tan trivial.
Si otras columnas hacen referencia a esta columna, entonces necesita averiguar qué hacer con otras tablas / columnas. Una opción es eliminar las claves externas y mantener los datos de referencia en otras tablas.
Otra opción es buscar todas las columnas de referencia y eliminarlas también si ya no son necesarias.
En tales casos, el verdadero desafío es encontrar todas las claves externas. Puede hacerlo consultando las tablas del sistema o utilizando herramientas de terceros como ApexSQL Search (gratis) o Red Gate Dependency tracker (premium pero más funciones). Hay un hilo entero en llaves foráneas here
ALTER TABLE MEN DROP COLUMN Lname