web-dev-qa-db-fra.com

Comment supprimer une colonne d'une table existante?

Comment supprimer une colonne d'une table existante?

J'ai une table MEN avec Fname et Lname

J'ai besoin de supprimer la Lname

Comment faire?

361
Gali
ALTER TABLE MEN DROP COLUMN Lname
630
jcomeau_ictx

Générique:

ALTER TABLE table_name DROP COLUMN column_name;

Dans ton cas: 

ALTER TABLE MEN DROP COLUMN Lname;
148
reggie

Votre exemple est simple et ne nécessite aucune modification supplémentaire de la table, mais d’une manière générale, cela n’est pas si trivial.

Si cette colonne est référencée par d'autres tables, vous devez savoir quoi faire avec d'autres tables/colonnes. Une option consiste à supprimer les clés étrangères et à conserver les données référencées dans d'autres tables.

Une autre option consiste à rechercher toutes les colonnes de référence et à les supprimer également si elles ne sont plus nécessaires. 

Dans ce cas, le véritable défi consiste à trouver toutes les clés étrangères. Vous pouvez le faire en interrogeant les tables système ou en utilisant des outils tiers tels que ApexSQL Search (gratuit) ou Red Gate Suivi des dépendances (premium mais plus de fonctionnalités). Il y a tout un fil sur les clés étrangères ici

72
John Moore

C'est la bonne réponse:

ALTER TABLE MEN DROP COLUMN Lname

Mais ... si une CONSTRAINT existe sur la COLUMN, vous devez d'abord DROP la CONSTRAINT, vous pourrez alors DROP la COLUMN. Pour supprimer une CONSTRAINT, exécutez:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
45
Aaron Lelevier

Dans SQL Server 2016 vous pouvez utiliser les nouvelles instructions DIE. 

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

La requête ci-dessus est ré-exécutable sur drops la colonne uniquement si elle est exists dans la table, sinon elle ne renverra pas d'erreur. 

Au lieu d'utiliser de grands wrappers IF pour vérifier l'existence de column avant de le déposer, vous pouvez simplement exécuter l'instruction DDL ci-dessus 

18

La question est de savoir si vous pouvez uniquement supprimer une colonne d’une table inexistante ;-) 

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  
7
Tad

La réponse simple à ceci est d'utiliser ceci:

ALTER TABLE MEN DROP COLUMN Lname;

Plus d'une colonne peut être spécifiée comme ceci:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

À partir de SQL Server 2016, il est également possible de supprimer la colonne si elle existe. Cela vous empêche d’obtenir une erreur pour quelque chose qui ne vous intéresse probablement pas.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Certaines conditions préalables sont nécessaires pour supprimer des colonnes. Les colonnes supprimées ne peuvent pas être:

  • Utilisé par un index
  • Utilisé par les contraintes CHECK, FOREIGN KEY, UNIQUE ou PRIMARY KEY
  • Associé à un DEFAULT
  • Lié à une règle

Si l'une des réponses ci-dessus est vraie, vous devez d'abord supprimer ces associations.

En outre, il convient de noter que le fait de supprimer une colonne ne récupère pas l'espace du disque dur jusqu'à ce que l'index clusterisé de la table soit reconstruit. En tant que tel, il est souvent conseillé de suivre ce qui précède avec une commande de reconstruction de table comme celle-ci:

ALTER TABLE MEN REBUILD;

Enfin, comme certains l’ont dit, cela peut être lent et va probablement verrouiller la table pour la durée. Il est possible de créer une nouvelle table avec la structure souhaitée puis de le renommer comme suit:

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;

Mais soyez averti qu'il existe une fenêtre pour la perte de données des lignes insérées ici entre la première commande de sélection et la dernière commande de changement de nom.

3
Martin Brown

Cela peut également être fait via l'interface graphique SSMS. La bonne chose à propos de cette méthode est qu’elle vous avertit s’il existe des relations sur cette colonne et peut également les supprimer automatiquement.

  1. Mettez la table en mode Création (clic droit sur la table) comme ceci:

 enter image description here

  1. Faites un clic droit sur la colonne en mode Création du tableau et cliquez sur "Supprimer Colonne"

 enter image description here

Comme je l’ai dit précédemment, s’il existe des relations qui doivent également être supprimées, il vous demandera maintenant si vous souhaitez les supprimer également. Vous devrez probablement le faire pour supprimer la colonne.

2
Tony L.

Pour ajouter des colonnes dans une table existante:

ALTER TABLE table_name
 ADD
 column_name DATATYPE NULL  

Pour supprimer des colonnes dans une table existante:

ALTER TABLE table_name
DROP COLUMN column_name
2
mithun

Si vous utilisez C # et que la colonne Identity est int, créez une nouvelle instance de int sans lui donner aucune valeur. Cela a fonctionné pour moi.

[identity_column] = new int ()

0
Quofi Ansah

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Par exemple

alter table Adresse de colonne de dépôt d'employé;

0
Anand Pipalwa