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?
ALTER TABLE MEN DROP COLUMN Lname
Générique:
ALTER TABLE table_name DROP COLUMN column_name;
Dans ton cas:
ALTER TABLE MEN DROP COLUMN Lname;
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
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}
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
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
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:
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.
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 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.
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
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 ()
ALTER TABLE TABLE_NAME DROP COLUMN COLUMN_NAME;
Par exemple
alter table Adresse de colonne de dépôt d'employé;