1358 votes

Modification d'une colonne : null to not null

J'ai une table qui comporte plusieurs colonnes de nombres entiers invalides. Cela n'est pas souhaitable pour plusieurs raisons. Je cherche donc à mettre à jour tous les zéros à 0, puis à définir ces colonnes comme suit NOT NULL . En dehors de la modification des valeurs nulles en 0 les données doivent être préservées.

Je suis à la recherche de la syntaxe SQL spécifique pour modifier une colonne (appelez-la ColumnA ) à " not null ". Supposons que les données ont été mises à jour pour ne pas contenir de nulles.

Utilisation de SQL server 2000 .

19 votes

Autre chose : vous pourriez ajouter une valeur par défaut pour que les insertions existantes qui ne spécifient pas la colonne n'échouent pas : ALTER TABLE FOO ADD CONSTRAINT FOO_Bar_Default DEFAULT 0 FOR Bar

5 votes

Vous serez également surpris d'apprendre que dans certaines circonstances modifier une colonne pour NOT NULL peut causer beaucoup de logging.

2192voto

mdb Points 20629

Tout d'abord, faites en sorte que tous les NULL disparaissent :

UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL

Ensuite, mettez à jour la définition de la table pour interdire les "NULL" :

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL

58 votes

Permettez-moi d'ajouter une valeur aux deux réponses correctes ci-dessus. La sémantique de NULL peut avoir plusieurs significations. L'une des significations les plus courantes est UNKNOWN. Prenons l'exemple du SCORE. Un SCORE nul et un SCORE ZÉRO, c'est un monde de différence ! Avant de faire les recommandations ci-dessus. Assurez-vous que votre application ne prend pas null dans sa logique d'entreprise.

252 votes

Sauvegardez d'abord votre base de données au cas où vous feriez une faute de frappe et que votre base de données explose.

16 votes

Les bases de données doivent toujours être sauvegardées. Vous ne savez jamais si l'un de vos collaborateurs peut écrire une instruction UPDATE ou DELETE et oublier la clause WHERE.

66voto

Greg Dougherty Points 474

J'ai eu le même problème, mais le champ avait la valeur par défaut null, et maintenant je veux le mettre à 0. Cela a nécessité l'ajout d'une ligne supplémentaire après la solution de mdb :

ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];

0 votes

Cela ne répond pas au problème. La valeur par défaut est déjà définie, c'est le NOT NULL qui doit être modifié. Avec seulement votre réponse, tous les enregistrements existants resteront NULL et le problème demeure.

7 votes

Avez-vous lu la partie concernant "l'ajout d'une ligne supplémentaire" ? Comme dans, ceci est en plus de la réponse ci-dessus ?

8 votes

En fait, il n'est pas clair que "ajouter une ligne supplémentaire" signifie "en plus de la réponse ci-dessus" (d'autant plus qu'il y a plusieurs réponses "ci-dessus") - si c'est ce que vous vouliez dire, alors la formulation doit vraiment être modifiée et vous devriez inclure la ligne de la réponse à laquelle vous faites référence.

41voto

Ralph Wiggum Points 281

Vous devrez le faire en deux étapes :

  1. Mettez à jour la table pour qu'il n'y ait pas de nulles dans la colonne.

    UPDATE MyTable SET MyNullableColumn = 0 WHERE MyNullableColumn IS NULL

  2. Modifier le tableau pour changer la propriété de la colonne

    ALTER TABLE MyTable ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL

0 votes

SET MyNullableColumn = 0 ne fonctionne que si votre colonne existante est une colonne numérique. Pour les types non numériques, vous devez définir une autre valeur par défaut, comme une chaîne vide ou une date par défaut, etc. Mais cette réponse est tout à fait pertinente pour la question ci-dessus et correcte ;-)

20voto

Dheeraj Sam Points 111

Cela a fonctionné pour moi :

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;

15voto

Eppz Points 1907

Tant que la colonne n'est pas un identifiant unique

UPDATE table set columnName = 0 where columnName is null

Puis

Modifiez la table et définissez le champ comme non nul et spécifiez une valeur par défaut de 0.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X