¿Cómo eliminar una columna de una tabla existente?


Respuestas:



157

Genérico:

ALTER TABLE table_name DROP COLUMN column_name;

En tu caso:

ALTER TABLE MEN DROP COLUMN Lname;

72

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í


47

Esta es la respuesta correcta:

ALTER TABLE MEN DROP COLUMN Lname

Pero ... si un CONSTRAINTexiste en el COLUMN, entonces debe DROPla CONSTRAINTprimera, entonces usted será capaz DROPdel COLUMN. Para soltar un CONSTRAINT, ejecute:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}

ALTER TABLE tb_name DROP FOREIGN KEY key_name
bortunac

3
¿CÓMO buscar constraintuna columna ?
Kiquenet

21

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 dropsla columna solo siexists en la tabla; de lo contrario, no arrojará un error.

En lugar de usar grandes IFenvoltorios para verificar la existencia de columnantes de soltarlo, simplemente puede ejecutar la DDLdeclaración anterior


3
¿Qué son las declaraciones DIE ?
Kiquenet

3
Por cierto, puede llamar a estos tipos de scripts / funciones "re-ejecutables" Idempotentes
tomosius el

44
Esta debería ser la respuesta aceptada. Si ha implementado scripts de SQL automatizados, debe escribir sus scripts a la defensiva de esta manera.
vencedor

7

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  

1
Supongo que si quisieras eliminar una columna de una tabla inexistente, esta sería la forma de hacerlo
Matiaan

6

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:

  • Usado por un índice
  • Usado por restricciones CHECK, FOREIGN KEY, UNIQUE o PRIMARY KEY
  • Asociado a un PREDETERMINADO
  • Obligado a una regla

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.


2

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

Pregunta no sobre AGREGAR columnas.
Kiquenet

2

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.

  1. Ponga la tabla en la vista Diseño (haga clic derecho en la tabla) así:

ingrese la descripción de la imagen aquí

  1. Haga clic derecho en la columna en la vista Diseño de la tabla y haga clic en "Eliminar columna"

ingrese la descripción de la imagen aquí

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.


0

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 ()


¿Qué hará esta respuesta? ¿Eliminará la columna de la tabla?
Prashant Pimpale

0

Sintaxis:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Por ejemplo:

alter table Employee drop column address;
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.