2010-08-16 7 views

Répondre

162

En option, vous pouvez initialement créer une colonne Null-able, puis mettre à jour votre colonne de table avec une valeur non nulle s et enfin ALTER colonne pour définir NOT NULL:

ALTER TABLE MY_TABLE ADD STAGE INT NULL 
GO 
UPDATE MY_TABLE SET <a valid not null values for your column> 
GO 
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL 
GO 

Une autre option est de spécifier la valeur par défaut correcte pour votre colonne:

ALTER TABLE MY_TABLE ADD STAGE INT NOT NULL DEFAULT '0' 

UPD: S'il vous plaît noter que la réponse ci-dessus contient GO qui est un must lorsque vous exécutez ce code sur un serveur Microsoft SQL. Si vous souhaitez effectuer la même opération sur Oracle ou MySQL vous devez utiliser virgule ; comme ça:

ALTER TABLE MY_TABLE ADD STAGE INT NULL; 
UPDATE MY_TABLE SET <a valid not null values for your column>; 
ALTER TABLE MY_TABLE ALTER COLUMN STAGE INT NOT NULL; 
+1

Je préfère personnellement la première méthode ici si vous avez des valeurs que vous pouvez mettre manuellement dans le champ. De cette façon, vous n'avez pas à vous soucier de créer et de supprimer une contrainte par défaut dont vous n'avez pas besoin. –

+0

@ MarkWDickson - Le premier semble plus dangereux pour moi. Que se passe-t-il si la colonne incorrecte est glissée dans l'instruction set: UPDATE MY_TABLE SET Employee_Salary = 0 – acarlon

+1

@acarlon - Je pense que c'est en train d'atteindre. La déclaration 'update' dangereuse que vous mentionnez serait préjudiciable dans toute requête. Cela devrait être assez simple pour voir si vous avez une colonne supplémentaire dans l'instruction 'update' ici. Vous ajouteriez généralement seulement une colonne ou deux à la fois. S'il vous arrive d'ajouter une colonne supplémentaire dans votre instruction 'update' qui n'appartient pas à cet exemple, dans cet exemple, vous ne devriez peut-être pas être en charge des données en premier lieu. –

4

Le message d'erreur est assez descriptif, essayez:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-'; 
+0

et quelle est la signification du "moins" dans la partie par défaut? –

11

Si vous ne permettez pas la colonne à être nul vous devez fournir une valeur par défaut pour remplir les lignes existantes. par exemple.

ALTER TABLE dbo.YourTbl ADD 
    newcol int NOT NULL CONSTRAINT DF_YourTbl_newcol DEFAULT 0 

Sur Enterprise Edition ceci est une metadata only change depuis 2012

+1

Vous n'avez pas besoin de *, mais c'est une option. – Matt

1
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`; 
3

Other SQL implementations have similar restrictions. La raison en est que l'ajout d'une colonne nécessite l'ajout de valeurs pour cette colonne (logiquement, même si pas physiquement), qui par défaut à NULL . Si vous n'autorisez pas NULL et que vous n'avez pas de default, quelle sera la valeur?

Depuis SQL Server prend en charge ADD CONSTRAINT, je vous recommande l'approche de Pavel de créer une colonne nullable, puis en ajoutant une contrainte NOT NULL après que vous l'avez rempli avec des valeurs non NULL.

2

Cela a fonctionné pour moi, peut également être "emprunté" à la vue de conception, apporter des modifications -> clic droit -> générer le script de changement.

BEGIN TRANSACTION 
GO 
ALTER TABLE dbo.YOURTABLE ADD 
    YOURCOLUMN bit NOT NULL CONSTRAINT DF_YOURTABLE_YOURCOLUMN DEFAULT 0 
GO 
COMMIT 
Questions connexes