Modification d'une colonne: nulle à non nulle

1218

J'ai une table qui a plusieurs colonnes entières nullables. Ceci n'est pas souhaitable pour plusieurs raisons, donc je cherche à mettre à jour toutes les valeurs nulles à 0, puis à définir ces colonnes sur NOT NULL. En plus de changer les valeurs nulles en 0, les données doivent être préservées.

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

Utilisation de SQL Server 2000 .

Codeur karmique
la source
16
Une autre chose - vous voudrez peut-être ajouter une valeur par défaut à ce que toutes 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
Marc Gravell
4
Vous pouvez également être surpris de savoir que, dans certaines circonstances, la modification d'une colonne NOT NULLpeut entraîner de nombreuses journalisations.
Martin Smith

Réponses:

2013

Tout d'abord, faites NULLdisparaître toutes les valeurs actuelles :

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

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

ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
mdb
la source
49
Permettez-moi d'ajouter de la valeur aux deux bonnes réponses ci-dessus. La sémantique de NULL peut avoir plusieurs significations. L'un des sens communs est INCONNU. Prenez SCORE comme exemple. Un SCORE nul et un SCORE ZÉRO 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 métier.
TechTravelThink
242
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.
mpen
20
C'est étrange que MS SQL Management Studio n'autorise pas cette option, il se vante de "Dropping table ..."
Sebastian
14
Les bases de données doivent toujours être sauvegardées. Vous ne savez jamais quand l'un de vos contacts peut écrire une instruction UPDATE ou DELETE et oublier la clause WHERE.
Vivian River
2
@SebastianGodelet: il y a un paramètre qui vous permet de désactiver cet avertissement, ou de le faire pour qu'il ne vous empêche pas de modifier la table. Dans certains cas, la modification du schéma d'une table nécessite la création d'une nouvelle table, la copie des données de l'ancienne et l'ancienne suppression. Étant donné qu'une erreur dans ce processus peut entraîner une perte de données, SSMS vous avertit et, par défaut, vous empêche de le faire.
siride
57

J'ai eu le même problème, mais le champ utilisé par défaut à null, et maintenant je veux le mettre à 0 par défaut. 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];
Greg Dougherty
la source
Cela ne résout pas le problème. La valeur par défaut est déjà définie, c'est le NOT NULL qui doit être changé. Avec seulement votre réponse, tous les enregistrements existants resteront NULS et le problème restera.
PandaWood
6
Avez-vous lu la partie sur "l'ajout d'une ligne de plus"? Comme dans, cela s'ajoute à la réponse ci-dessus?
Greg Dougherty
7
En fait, non, il n'est pas clair que "ajouter une ligne de plus" signifie "en plus de la réponse ci-dessus" (d'autant plus qu'il y a beaucoup de réponses "ci-dessus") - si c'est ce que vous vouliez dire, alors la formulation doit vraiment changer et vous devriez inclure la ligne de la réponse à laquelle vous vous référez
PandaWood
2
Je voulais juste faire un carillon et dire que c'est une bonne idée de nommer explicitement vos contraintes, par défaut incluses. Si vous devez supprimer une colonne, vous devez connaître le nom de la contrainte à supprimer avant de pouvoir le faire. Ran dans cela dans nos migrations de base de données à quelques reprises. Je sais que l'exemple l'inclut ici, mais c'est toujours un endroit où certains développeurs voyagent parce que le nom n'est pas requis.
jocull
38

Vous devrez le faire en deux étapes:

  1. Mettez à jour la table afin qu'il n'y ait pas de valeurs nulles dans la colonne.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
  1. Modifier la table pour modifier la propriété de la colonne
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Ralph Wiggum
la source
27

Pour Oracle 11g, j'ai pu modifier l'attribut de colonne comme suit:

ALTER TABLE tablename MODIFY columnname datatype NOT NULL;

Sinon, la réponse d'Abatichev semblait bonne. Vous ne pouvez pas répéter l'alter - il se plaint (au moins dans SQL Developer) que la colonne n'est déjà pas nulle.

JDM
la source
Il semble que dans Oracle 11, vous n'ayez pas à répéter la datatype. C'est tout simplement columname NOT NULLsuffisant. Consultez la documentation .
jpmc26
18

cela a fonctionné pour moi:

ALTER TABLE [Table] 
Alter COLUMN [Column] VARCHAR(50) not null;
Dheeraj Sam
la source
16

Tant que la colonne n'est pas un identifiant unique

UPDATE table set columnName = 0 where columnName is null

alors

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

Eppz
la source
4

cela semble plus simple, mais ne fonctionne que sur Oracle:

ALTER TABLE [Table] 
ALTER [Column] NUMBER DEFAULT 0 NOT NULL;

en outre, avec cela, vous pouvez également ajouter des colonnes, pas seulement le modifier. Il met à jour la valeur par défaut (0) dans cet exemple, si la valeur était nulle.

csomakk
la source
oui, mais google dirige les gens ici .. Il a reçu beaucoup de votes positifs et beaucoup de votes négatifs. Je pense que c'est utile. Tout le monde est libre d'ignorer cela, mais honnêtement, je pense et vois que cela aide les gens.
csomakk
Veuillez lire les règles SO. Comment écrire une bonne réponse? , RÉPONDRE QUESTIONS TECHNIQUES obligeamment et écrire la question parfaite . Remarques: N'ayez pas peur de supprimer (ou de modifier fortement) les réponses inutiles et ne répondez pas et exécutez
Kiquenet
4

En cas de FOREIGN KEY CONSTRAINT... il y aura un problème si '0' n'est pas présent dans la colonne de la table de clé primaire. La solution pour cela est ...

ÉTAPE 1:

Désactivez toutes les contraintes à l'aide de ce code:

EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"

ÉTAPE 2:

RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)

ÉTAPE 3:

Activez toutes les contraintes à l'aide de ce code:

exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
sam05
la source
4

Dans mon cas, j'ai eu des difficultés avec les réponses affichées. J'ai fini par utiliser ce qui suit:

ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';

Modifiez VARCHAR(200)votre type de données et modifiez éventuellement la valeur par défaut.

Si vous n'avez pas de valeur par défaut, vous aurez un problème à effectuer cette modification, car la valeur par défaut serait null créant un conflit.

Philip Kirkbride
la source
1

Prenons un exemple:

TABLE NAME=EMPLOYEE

Et je veux changer la colonne EMPLOYEE_NAMEen NOT NULL. Cette requête peut être utilisée pour la tâche:

ALTER TABLE EMPLOYEE MODIFY EMPLOYEE.EMPLOYEE_NAME datatype NOT NULL;
Ashish Dwivedi
la source
Veuillez ne pas crier et utiliser la mise en forme à la place pour rendre votre message plus lisible. Par exemple, aide à reconnaître la partie du code. stackoverflow.com/editing-help
Yunnosch
De plus, veuillez ne pas écrire de texte plus long en majuscules. C'est considéré comme crier sur Internet
Zoé
1
@PawanTiwari veuillez apporter des modifications complètes. Vous ne semblez pas avoir résolu tous les problèmes de la publication. La majeure partie est capitalisée.
double bip le
@ double bip, bien sûr, je garderai cela à l'esprit. Merci
Pawan Tiwari
Outre les problèmes de formatage, veuillez indiquer plus clairement les informations supplémentaires fournies par votre réponse, par exemple par rapport aux anciennes réponses de Ralph Wiggum, JDM, Rashmi Singh et trooper31, qui semblent fonctionnellement identiques à première vue. Il semble donc nécessaire de souligner les points les plus fins de votre solution. Essayez d'éviter l'impression de simplement copier les réponses ...
Yunnosch
0

Pour la javaDB intégrée incluse dans le JDK (la distribution prise en charge par Oracle de l'Apache Derby), ce qui suit a fonctionné pour moi

alter table [table name] alter column [column name] not null;
trooper31
la source
0

Rendre la colonne non nulle et ajouter des valeurs par défaut peut également être fait dans l'interface graphique SSMS.

  1. Comme d'autres l'ont déjà dit, vous ne pouvez pas définir «non nul» tant que toutes les données existantes ne sont pas «non nulles» comme ceci:

UPDATE myTable SET myColumn = 0

  1. Une fois cela fait, avec le tableau en mode Création (cliquez avec le bouton droit sur le tableau et cliquez sur " Mode Création "), vous pouvez simplement décocher les colonnes Autoriser les valeurs nulles comme suit :

entrez la description de l'image ici

  1. Toujours en mode Création avec la colonne sélectionnée, vous pouvez voir les propriétés de la colonne dans la fenêtre ci-dessous et définir la valeur par défaut à 0, ainsi:

entrez la description de l'image ici

Tony L.
la source
Je vois le downvote mais je ne peux rien corriger sans feedback. Veuillez me faire savoir si quelque chose n'a pas fonctionné.
Tony L.
-1

Vous pouvez modifier la définition de la colonne DB existante à l'aide de sql suivant.

ALTER TABLE mytable modify mycolumn datatype NOT NULL;
Rashmi singh
la source