Comment changer le type de données de colonne dans la base de données SQL sans perdre de données


198

J'ai une base de données SQL Server et je viens de réaliser que je peux changer le type de l'une des colonnes de intà bool.

Comment puis-je le faire sans perdre les données qui sont déjà entrées dans ce tableau?


3
Avez-vous essayé de créer une nouvelle colonne de bits, de copier les valeurs de l'ancienne colonne dans la nouvelle, de supprimer l'ancienne et de renommer la nouvelle? Tout cela dans une transaction, bien sûr, pour faire reculer les problèmes.
Radu Caprescu

2
Vous dites "Je viens de réaliser que je peux changer le type d'une des colonnes de int en bool" Il n'y a pas de type de données booléen. Mais il y a peu. Demandez-vous comment vous pouvez le faire (comme les 2 réponses ont jusqu'à présent couvert). Ou est votre question "Je viens de réaliser que c'est possible - Comment SQL Server fait-il cela?"
Martin Smith

Réponses:


329

Vous pouvez facilement le faire en utilisant la commande suivante. Toute valeur de 0 sera transformée en 0 (BIT = false), tout le reste sera transformé en 1 (BIT = true).

ALTER TABLE dbo.YourTable
   ALTER COLUMN YourColumnName BIT

L'autre option serait de créer une nouvelle colonne de type BIT, de la remplir à partir de l'ancienne colonne, et une fois que vous avez terminé, déposez l'ancienne colonne et renommez la nouvelle en l'ancien nom. De cette façon, si quelque chose se passe mal pendant la conversion, vous pouvez toujours revenir en arrière car vous avez toujours toutes les données.


10
En d'autres termes: NULLreste NULL, 0devient False, des valeurs non nulles (1, -1, 1999, -987 ...) deviennent True.
Álvaro González

2
Et n'effectuez jamais une telle modification depuis l'interface graphique. Faites toujours cela à travers un script comme celui-ci. L'interface graphique va supprimer et recréer la table et cela prend beaucoup plus de temps. Si la table est grande et en production, cela peut être désastreux. De plus, toutes les modifications de table doivent avoir un script qui est en contrôle de code source comme tout autre code.
HLGEM

1
J'ajouterais, c'est de vous assurer que vous avez une sauvegarde actuelle de la base de données avant d'apporter toute modification structurelle à une table avec des données. Et n'effectuez pas de modification comme celle-ci sur la production pendant les heures de pointe si la table est fréquemment utilisée ou volumineuse.
HLGEM

J'ai approuvé par erreur les modifications ... besoin de rejeter .. car pas d'améliorations là-bas ... Ans est parfait.
Vikash Pathak

22
ALTER TABLE tablename
ALTER COLUMN columnname columndatatype(size)

Remarque: s'il y a une taille de colonnes, écrivez simplement la taille également.


20

S'il s'agit d'un changement valide.

vous pouvez changer la propriété.

Outils -> Options -> Concepteurs -> Concepteurs de tables et de bases de données -> Décocher -> Empêcher l'enregistrement des modifications nécessitant une recréation de table.

Maintenant, vous pouvez facilement changer le nom de la colonne sans recréer la table ou perdre vos enregistrements ur.


5
Vous ne devez en aucun cas effectuer des modifications de table à l'aide de l'interface graphique. Il recréera complètement la table plutôt que d'utiliser la table Alter et cela posera un problème si vous décochez cette option et que la table est grande. De plus, vous devriez avoir toutes les modifications apportées aux tables dans un script dans le contrôle de code source.
HLGEM

Examinez de plus près cette option - elle désactive une sécurité qui empêchera l'interface graphique de laisser tomber la table. Vous ne semblerez pas perdre de données, car l'interface graphique recréera la table, mais sur le serveur, elle sera copiée / supprimée. Donc, s'il y a beaucoup de données dans la table, cela entraînera une très grande opération. De plus, je pense (pas positif) que cela se produit en une seule transaction, vous pouvez donc remplir votre journal des transactions.
JMarsch

1
Je suppose que j'aimerais ajouter une petite précision à mon commentaire précédent. Si vous ne faites que cela sur votre machine de développement, vous allez probablement bien. Mais je ne conseillerais pas d'utiliser cette méthode sur une base de données de production - surtout si c'est une mission critique.
JMarsch

8

Pourquoi pensez-vous que vous perdrez des données? Accédez simplement à Management Studio et modifiez le type de données. Si la valeur existante peut être convertie en bool (bit), elle le fera. En d'autres termes, si "1" correspond à vrai et "0" correspond à faux dans votre champ d'origine, tout ira bien.


1
Si vous avez des données dans le tableau, cela ne fonctionnera pas. Lorsque vous essayez de modifier un type de colonne, SMS prétend qu'il doit d'abord supprimer la table ... ce qui bien sûr est incorrect car la commande ALTER TABLE ... ALTER COLUMN fonctionne très bien même pour les champs non NULL. C'est pourquoi ils pensaient pouvoir perdre des données.
Tony O'Hagan

1
@ TonyO'Hagan Ce n'est pas vrai. Vous pouvez désactiver l'avertissement et cela fonctionnera très bien avec les données existantes. Voir aussi stackoverflow.com/questions/2947865/…
Philippe Leybaert

1
OK cool! Je ne le savais pas. Je viens d'essayer de vous voter (en arrière), mais SO m'empêche à moins que vous ne modifiiez votre réponse. Peut-être un changement mineur et je peux le faire;).
Tony O'Hagan,

1
Vous ne devez en aucun cas effectuer des modifications de table à l'aide de l'interface graphique. Il recréera complètement la table plutôt que d'utiliser la table Alter et cela posera un problème si vous décochez cette option et que la table est grande. De plus, vous devriez avoir toutes les modifications apportées aux tables dans un script dans le contrôle de code source.
HLGEM

En aucun cas, il n'y a aucune raison d'utiliser l'interface graphique pour concevoir ou modifier une table et de bonnes raisons de ne pas le faire. Toutes les modifications doivent être dans des scripts pour pouvoir se propager à d'autres serveurs et traitées comme le code qu'elles sont réellement dans le contrôle de code source.
HLGEM

5

si vous utilisez T-SQL (MSSQL); vous devriez essayer ce script:

ALTER TABLE [Employee] ALTER COLUMN [Salary] NUMERIC(22,5)

si vous utilisez MySQL; vous devriez essayer ce script:

ALTER TABLE [Employee] MODIFY COLUMN [Salary] NUMERIC(22,5)

si vous utilisez Oracle; vous devriez essayer ce script:

ALTER TABLE [Employee] MODIFY [Salary] NUMERIC(22,5)

3

Accédez à Tool-Option-designers-Table et Database designers et décochez l'option Prevent saveentrez la description de l'image ici


1
Vous ne devez en aucun cas effectuer des modifications de table à l'aide de l'interface graphique. Il recréera complètement la table plutôt que d'utiliser la table Alter et cela posera un problème si vous décochez cette option et que la table est grande. De plus, vous devriez avoir toutes les modifications apportées aux tables dans un script dans le contrôle de code source.
HLGEM

2

Modifier le type de données de la colonne avec vérifier le type de colonne:

IF EXISTS(
       SELECT 1
       FROM   sys.columns
       WHERE  NAME = 'YourColumnName'
              AND [object_id] = OBJECT_ID('dbo.YourTable')
              AND TYPE_NAME(system_type_id) = 'int'
   )
    ALTER TABLE dbo.YourTable ALTER COLUMN YourColumnName BIT

1

pour moi, dans sql server 2016, je le fais comme ça

* Pour renommer la colonne Colonne1 en colonne2

EXEC sp_rename 'dbo.T_Table1.Column1', 'Column2', 'COLUMN'

* Pour modifier le type de colonne de la chaîne à l' int : ( veuillez vous assurer que les données sont au format correct )

ALTER TABLE dbo.T_Table1 ALTER COLUMN Column2  int; 

0

Dans l'édition compacte prendra automatiquement la taille pour le type de données datetime ie (8) donc pas besoin de définir la taille du champ et de générer une erreur pour cette opération ...


-2

Je peux modifier le type de données du champ de table, avec les requêtes suivantes: et aussi dans la base de données Oracle,

ALTER TABLE table_name
MODIFY column_name datatype;

Pas dans SQl Server
HLGEM

-4

Remplacez le type de données sans perdre de données

alter table tablename modify columnn  newdatatype(size);
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.