Comment supprimer une colonne d'une table existante?
J'ai une table MEN
avec Fname
etLname
Je dois retirer le Lname
Comment faire?
Comment supprimer une colonne d'une table existante?
J'ai une table MEN
avec Fname
etLname
Je dois retirer le Lname
Comment faire?
Réponses:
ALTER TABLE MEN DROP COLUMN Lname
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
Voici la bonne réponse:
ALTER TABLE MEN DROP COLUMN Lname
Mais ... si un CONSTRAINT
existe sur le COLUMN
, alors vous devez DROP
le CONSTRAINT
premier, alors vous pourrez DROP
le COLUMN
. Pour supprimer un CONSTRAINT
, exécutez:
ALTER TABLE MEN DROP CONSTRAINT {constraint_name_on_column_Lname}
constraint
une colonne ?
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 drops
la colonne uniquement si elle est exists
dans la table, sinon elle ne générera pas d'erreur.
Au lieu d'utiliser de gros IF
wrappers pour vérifier l'existence de column
avant de le supprimer, vous pouvez simplement exécuter l' DDL
instruction ci-dessus
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
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:
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.
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.
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.
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 ()
Syntaxe:
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Par exemple:
alter table Employee drop column address;