2010-10-22 3 views
44

Puis-je ajouter une colonne qui est je PRÉCISE NOT NULL, je ne veux pas spécifier la valeur par défaut, mais MS-SQL 2005 dit:Puis-je ajouter une colonne NOT NULL, sans valeur DEFAULT

ALTER TABLE autorise uniquement l'ajout de colonnes pouvant contenir des valeurs NULL ou une définition DEFAULT spécifiée, ou la colonne ajoutée est une colonne d'identité ou d'horodatage, ou bien si aucune des conditions précédentes n'est satisfaite, la table doit être vide pour permettre l'ajout de cette colonne. La colonne 'test' ne peut pas être ajoutée à la table non vide 'shiplist' car elle ne remplit pas ces conditions.

Si OUI, s'il vous plaît laissez-moi savoir la syntaxe, si non, veuillez préciser la raison.

Répondre

59

Non, vous ne pouvez pas. Parce que si vous le pouviez, SQL ne saurait pas ce qu'il faut mettre en valeur dans les enregistrements déjà existants. Si vous n'aviez aucun enregistrement dans la table, cela fonctionnerait sans problèmes.

La méthode la plus simple consiste à créer la colonne par défaut, puis à supprimer la valeur par défaut. Une autre alternative serait d'ajouter la colonne sans la contrainte, remplir les valeurs pour toutes les cellules et ajouter la contrainte.

8

Non - SQL Server rejette tout à fait raisonnable, parce que il ne saurait pas quelle valeur les lignes existantes devraient avoir

Il est facile de créer un DEFAULT en même temps, puis déposer immédiatement.

18

Ajoutez la colonne à la table, mettez à jour les lignes existantes afin qu'aucune d'elles ne soit nulle, puis ajoutez une contrainte "non null".

+3

Ceci est une meilleure solution que de créer/déposer la valeur par défaut, si le logique pour les nouvelles valeurs est plus complexe qu'une simple constante. –

+0

Pourquoi, ou comment, est-il préférable de mettre à jour (manuellement?) + En changeant "non nul, au lieu de" mettre à jour "automatiquement par défaut + en changeant en" non par défaut "(abandon par défaut)? –

+0

@ vgv8 les nouvelles valeurs dans chaque ligne dépendent des autres colonnes déjà dans la ligne Vous ne pouvez pas exprimer cela par une contrainte par défaut –

0

n °

Il suffit d'utiliser une chaîne vide '' (en cas de type de caractère) ou 0 (si numérique), etc en tant que valeur DEFAULT

0

Non, vous ne pouvez pas, comme SQL Server, ou tout Les autres moteurs de base de données forceront cette nouvelle colonne à être nulle pour les lignes existantes dans votre table de données. Mais puisque vous n'autorisez pas une valeur NULL, vous devez fournir une valeur par défaut afin de respecter votre propre contrainte. Cela tombe sous le bon sens! DBE n'extrapera pas une valeur pour les valeurs non nulles pour les lignes existantes.

+0

Bien que ce que vous dites ait du sens, il n'est pas vrai qu'au moins un "moteur de base de données" soit MS Access, ce qui permet à une colonne "NOT NULL" d'être ajouté à une table sans spécifier également un 'DEFAULT', le r Esult dont des valeurs nulles dans une colonne 'NOT NULL'. Je fournirai une preuve en guise de réponse ... – onedaywhen

0

@Damien_The_Unbeliever's comment, Ajoute-t-il une colonne calculée? Ni question ni réponse n'impliquaient quoi que ce soit de pareil. Dans le cas de la colonne calculée les états d'erreur:

« seulement unique ou primaire contraintes clés peuvent être créés sur des colonnes calculées, alors que CHECK, FOREIGN KEY et NOT contraintes NULL exigent que les colonnes calculées être conservées »

OK, si continuer ce jeu de devinettes, voici mon script qui illustre l'ajout de la colonne « NOT NULL » dans un « ALTER TABLE » étape:

CREATE TABLE TestInsertComputedColumn 
(
    FirstName VARCHAR(100), 
    LastName CHAR(50) 
); 

insert into TestInsertComputedColumn(FirstName,LastName) 
    select 'v', 'gv8'; 
select * from TestInsertComputedColumn; 

ALTER TABLE TestInsertComputedColumn 
     ADD FullName As FirstName + LastName PERSISTED NOT NULL; 

select * from TestInsertComputedColumn; 
--drop TABLE TestInsertComputedColumn; 
1

vous ne pouvez pas non.Mais vous pouvez envisager de spécifier la valeur par défaut (« »)

1

J'utilise cette approche pour insérer colonne NOT NULL sans valeur par défaut

ALTER TABLE [Table] ADD [Column] INT NULL 
GO 
UPDATE [Table] SET [Column] = <default_value> 
ALTER TABLE [Table] ALTER COLUMN [Column] INT NOT NULL 
Questions connexes