web-dev-qa-db-fra.com

insérer une colonne NOT NULL dans une table existante

J'ai essayé:

ALTER TABLE MY_TABLE 
ADD STAGE INT NOT NULL;

Mais cela donne ce message d'erreur:

ALTER TABLE autorise uniquement l'ajout de colonnes pouvant contenir des valeurs NULL ou avoir une définition DEFAULT spécifiée

100
ANP

En option, vous pouvez initialement créer une colonne Null -able, puis mettre à jour votre colonne de table avec des valeurs valides et null, et enfin, ALTER column pour définir la contrainte 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 consiste à spécifier la valeur par défaut correcte pour votre colonne:

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

UPD: Veuillez noter que la réponse ci-dessus contient la variable GO, indispensable lorsque vous exécutez ce code sur un serveur Microsoft SQL. Si vous voulez effectuer la même opération sur Oracle ou MySQL, vous devez utiliser le point-virgule ; comme ceci:

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;
185
Pavel Morshenyuk

Si vous n'autorisez pas la colonne à la valeur Null, 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

Sous Enterprise Edition, il s'agit d'un changement de métadonnées uniquement depuis 2012

11
Martin Smith

Le message d'erreur est assez descriptif, essayez:

ALTER TABLE MyTable ADD Stage INT NOT NULL DEFAULT '-';
5
a'r

D'autres implémentations SQL ont des restrictions similaires. La raison en est que l'ajout d'une colonne nécessite l'ajout de valeurs pour cette colonne (logiquement, même si ce n'est pas physiquement), la valeur par défaut étant NULL. Si vous n'autorisez pas NULL et n'avez pas de default, quelle va être la valeur?

Étant donné que SQL Server prend en charge ADD CONSTRAINT, je recommanderais l'approche de Pavel consistant à créer une colonne nullable, puis à ajouter une contrainte NOT NULL après l'avoir renseignée avec des valeurs non -NULL.

3
dan04

Cela a fonctionné pour moi, peut également être "emprunté" à partir de la vue de conception, apportez 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
2
pabbie
ALTER TABLE `MY_TABLE` ADD COLUMN `STAGE` INTEGER UNSIGNED NOT NULL AFTER `PREV_COLUMN`;
1
ajoejoseph
Alter TABLE 'TARGET' add 'ShouldAddColumn' Integer Not Null default "0"
0
AKronis1369