Comment supprimer une colonne d'une table existante?

Réponses:

661
ALTER TABLE MEN DROP COLUMN Lname
jcomeau_ictx
la source
157

Générique:

ALTER TABLE table_name DROP COLUMN column_name;

Dans ton cas:

ALTER TABLE MEN DROP COLUMN Lname;
reggie
la source
72

Votre exemple est simple et ne nécessite aucune modification de table supplémentaire, mais en règle générale, ce n'est pas si trivial.

Si cette colonne est référencée par d'autres tables, vous devez déterminer quoi faire avec les 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 de tels 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 Dependency tracker (premium mais plus de fonctionnalités). Il y a tout un fil sur les clés étrangères ici

John Moore
la source
47

Voici la bonne réponse:

ALTER TABLE MEN DROP COLUMN Lname

Mais ... si un CONSTRAINTexiste sur le COLUMN, alors vous devez DROPle CONSTRAINTpremier, alors vous pourrez DROPle COLUMN. Pour supprimer un CONSTRAINT, exécutez:

ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
Aaron Lelevier
la source
ALTER TABLE tb_name DROP FOREIGN KEY nom_clé
bortunac
3
COMMENT rechercher constraintune colonne ?
Kiquenet
21

Dans SQL Server 2016, vous pouvez utiliser de nouvelles instructions DIE.

ALTER TABLE Table_name DROP COLUMN IF EXISTS Column_name

La requête ci-dessus est réexécutable dans dropsla colonne uniquement si elle est existsdans la table, sinon elle ne générera pas d'erreur.

Au lieu d'utiliser de gros IFwrappers pour vérifier l'existence de columnavant de le supprimer, vous pouvez simplement exécuter l' DDLinstruction ci-dessus

P ரதீப்
la source
3
Qu'est-ce que les déclarations DIE ?
Kiquenet
3
Soit dit en passant, vous pouvez appeler ces types de scripts / fonctions "réexécutables" Idempotent
tomosius
4
ce devrait être la réponse acceptée. Si vous avez des déploiements de scripts sql automatisés, vous devez écrire vos scripts de manière défensive comme ceci.
vainqueur
7

La question est, pouvez-vous seulement 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  
Tad
la source
1
Je suppose que si vous vouliez supprimer une colonne d'une table inexistante, ce serait la façon de le faire
Matiaan
6

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

ALTER TABLE MEN DROP COLUMN Lname;

Plusieurs colonnes peuvent être spécifiées comme ceci:

ALTER TABLE MEN DROP COLUMN Lname, secondcol, thirdcol;

À partir de SQL Server 2016, il est également possible de supprimer la colonne uniquement si elle existe. Cela vous empêche d'obtenir une erreur lorsque la colonne n'existe pas, ce qui ne vous intéresse probablement pas.

ALTER TABLE MEN DROP COLUMN IF EXISTS Lname;

Il existe certaines conditions préalables à la suppression de 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 la suppression d'une colonne ne récupère pas l'espace du disque dur jusqu'à ce que l'index cluster de la table soit reconstruit. En tant que tel, c'est souvent une bonne idée 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 bloquera probablement la table pour la durée. Il est possible de créer une nouvelle table avec la structure souhaitée puis de renommer comme ceci:

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 y a une fenêtre pour la perte de données des lignes insérées ici entre la première sélection et la dernière commande de renommage.

Martin Brown
la source
2

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
mithun
la source
Question pas sur les colonnes ADD .
Kiquenet
2

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 le tableau en mode Création (clic droit sur le tableau) comme ceci:

entrez la description de l'image ici

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

entrez la description de l'image ici

Comme je l'ai déjà dit, s'il existe des relations qui devraient également être supprimées, il vous demandera à ce stade si vous souhaitez également les supprimer. Vous devrez probablement le faire pour supprimer la colonne.

Tony L.
la source
0

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

[colonne_identité] = new int ()

EA Lehn
la source
Que fera cette réponse? Va-t-il supprimer la colonne du tableau?
Prashant Pimpale
0

Syntaxe:

ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;

Par exemple:

alter table Employee drop column address;
Anand Pipalwa
la source