Modification d'une colonne: null à not null
J'ai une table qui a plusieurs colonnes entières nullables. Ceci est indésirable pour plusieurs raisons, donc je cherche à mettre à jour tous les valeurs NULL à 0, puis à définir ces colonnes à NOT NULL
. En plus de changer les valeurs NULL en 0
, les données doivent être conservées.
Je cherche 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 valeurs nulles.
En utilisant SQL server 2000 .
11 réponses
Tout d'abord, faites disparaître toutes les valeurs nulles actuelles:
UPDATE [Table] SET [Column]=0 WHERE [Column] IS NULL
Ensuite, mettez à jour la définition de la table pour interdire les valeurs nulles:
ALTER TABLE [Table] ALTER COLUMN [Column] INTEGER NOT NULL
J'ai eu le même problème, mais le champ utilisé par défaut à null, et maintenant je veux par défaut à 0. Cela nécessitait d'ajouter une ligne de plus après la solution de mdb:
ALTER TABLE [Table] ADD CONSTRAINT [Constraint] DEFAULT 0 FOR [Column];
Vous devrez le faire en deux étapes:
- Mettez à jour la table afin qu'il n'y ait pas de valeurs NULL dans la colonne.
UPDATE MyTable SET MyNullableColumn = 0
WHERE MyNullableColumn IS NULL
- Modifier le tableau pour modifier la propriété de la colonne
ALTER TABLE MyTable
ALTER COLUMN MyNullableColumn MyNullableColumnDatatype NOT NULL
Pour Oracle 11g, j'ai pu changer 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 null.
Tant Que la colonne n'est pas un identificateur unique
UPDATE table set columnName = 0 where columnName is null
Puis
Modifiez la table et définissez le champ sur non null et spécifiez une valeur par défaut de 0
Cela a fonctionné pour moi:
ALTER TABLE [Table]
Alter COLUMN [Column] VARCHAR(50) not null;
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 null.
Dans mon cas, j'ai eu des difficultés avec les réponses. J'ai fini par utiliser ce qui suit:
ALTER TABLE table_name CHANGE COLUMN column_name column_name VARCHAR(200) NOT NULL DEFAULT '';
Remplacez VARCHAR(200)
par votre type de données et modifiez éventuellement la valeur par défaut.
Si vous n'avez pas de valeur par défaut, vous allez avoir un problème pour effectuer cette modification, car default serait null créant un conflit.
Dans le cas de FOREIGN KEY CONSTRAINT
... il y aura un problème si '0' n'est pas présent dans la colonne de clé Primaire de la table. La solution pour cela est...
ETAPE 1:
Désactivez toutes les contraintes en utilisant ce code:
EXEC sp_msforeachtable "ALTER TABLE ? NOCHECK CONSTRAINT all"
ETAPE 2:
RUN UPDATE COMMAND (as mentioned in above comments)
RUN ALTER COMMAND (as mentioned in above comments)
ETAPE 3:
Activez toutes les contraintes en utilisant ce code:
exec sp_msforeachtable @command1="print '?'", @command2="ALTER TABLE ? WITH CHECK CHECK CONSTRAINT all"
Rendre la colonne non null et ajouter default peut également être fait dans L'interface graphique SSMS.
- comme d'autres l'ont déjà dit, vous ne pouvez pas définir "not null" jusqu'à ce que tous les données existantes sont "not null" comme ceci:
UPDATE myTable SET myColumn = 0
- Une fois cela fait, avec la table en mode design (clic droit sur table et cliquez sur "Vue de conception"), vous pouvez simplement décocher le Autoriser Les valeurs null colonnes comme ceci:
- toujours en mode design avec la colonne sélectionné, vous pouvez voir le Propriétés de la colonne dans la fenêtre ci-dessous et définissez la valeur par défaut à 0 comme suit:
Pour le javaDB intégré inclus dans le JDK (la distribution prise en charge par Oracle du Derby Apache) ci-dessous a fonctionné pour moi
alter table [table name] alter column [column name] not null;