¿Cómo eliminar una columna de una tabla existente?
Tengo una mesa MEN
con Fname
yLname
Necesito eliminar el Lname
¿Cómo hacerlo?
¿Cómo eliminar una columna de una tabla existente?
Tengo una mesa MEN
con Fname
yLname
Necesito eliminar el Lname
¿Cómo hacerlo?
Respuestas:
ALTER TABLE MEN DROP COLUMN Lname
Su ejemplo es simple y no requiere ningún cambio adicional en la tabla, pero en general esto no es tan trivial.
Si otras columnas hacen referencia a esta columna, debe averiguar qué hacer con otras tablas / columnas. Una opción es eliminar las claves externas y mantener los datos referenciados en otras tablas.
Otra opción es encontrar todas las columnas de referencia y eliminarlas también si ya no se necesitan.
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 el rastreador de dependencias de Red Gate (premium pero más funciones). Hay todo un hilo sobre claves foráneas aquí
Esta es la respuesta correcta:
ALTER TABLE MEN DROP COLUMN Lname
Pero ... si un CONSTRAINT
existe en el COLUMN
, entonces debe DROP
la CONSTRAINT
primera, entonces usted será capaz DROP
del COLUMN
. Para soltar un CONSTRAINT
, ejecute:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
una columna ?
En SQL Server 2016 puede usar nuevas instrucciones DIE.
ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name
La consulta anterior se puede volver a ejecutar en drops
la columna solo siexists
en la tabla; de lo contrario, no arrojará un error.
En lugar de usar grandes IF
envoltorios para verificar la existencia de column
antes de soltarlo, simplemente puede ejecutar la DDL
declaración anterior
La pregunta es, ¿solo puede eliminar una columna de una tabla que no existe ;-)
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;
Se puede especificar más de una columna de esta manera:
ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;
Desde SQL Server 2016 también es posible soltar la columna solo si existe. Esto evita que recibas un error cuando la columna no existe, algo que probablemente no te importe.
ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;
Hay algunos requisitos previos para colocar columnas. Las columnas soltadas no pueden ser:
Si alguno de los anteriores es cierto, primero debe eliminar esas asociaciones.
Además, debe tenerse en cuenta que al soltar 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 mesa durante todo el tiempo. 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 aquí hay una ventana para la pérdida de datos de las filas insertadas entre la primera selección y el último comando de cambio de nombre.
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 relaciones en esa columna y también puede eliminarlas automáticamente.
Como dije antes, si hay relaciones que también tendrían que eliminarse, en este punto le preguntará si desea eliminarlas también. Es probable que deba hacerlo para eliminar la columna.
Si está utilizando C # y la columna Identidad es int, cree una nueva instancia de int sin proporcionarle ningún valor. Funcionó para mí.
[identidad_columna] = nuevo int ()
Sintaxis:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Por ejemplo:
alter table Employee drop column address;