web-dev-qa-db-fra.com

Puis-je ajouter une colonne non NULL sans valeur DEFAULT

Puis-je ajouter une colonne spécifiée par NOT NULL, je ne souhaite pas spécifier la valeur DEFAULT mais MS-SQL 2005 indique:

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

Si oui, s'il vous plaît laissez-moi savoir la syntaxe, si non s'il vous plaît spécifier la raison.

56
Saubhagya

Non, tu ne peux pas. 

Parce que si vous le pouviez, SQL ne saurait pas quoi mettre en valeur dans les enregistrements existants. Si vous n'aviez aucun enregistrement dans la table, cela fonctionnerait sans problème. 

Pour ce faire, le moyen le plus simple consiste à créer la colonne avec une valeur par défaut, puis à la supprimer.

ALTER TABLE dbo.MyTable ADD
MyColumn text NOT NULL CONSTRAINT DF_MyTable_MyColumn DEFAULT 'defaultValue'
ALTER TABLE dbo.MyTable
DROP CONSTRAINT DF_MyTable_MyColumn

Une autre solution consisterait à ajouter la colonne sans la contrainte, à renseigner les valeurs pour toutes les cellules et à ajouter la contrainte.

75
Gimly

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

19
Paul Tomblin

Non - SQL Server rejette cela avec raison, car il ne saurait pas quelle valeur les lignes existantes devraient avoir

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

8

J'utilise cette approche pour insérer une 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
2
sad_robot

Non vous ne pouvez pas. Mais vous pouvez envisager de spécifier la valeur par défaut à ('')

1
chris

Non.

Utilisez simplement la chaîne vide '' (en cas de type de caractère) ou 0 (en cas de valeur numérique), etc. comme valeur DEFAULT

0
abatishchev

@ Commentaire de Damien_The_Unbeliever , .__ Ajoute-t-il une colonne calculée? Ni question ni réponse n'impliquait une telle chose. En cas de colonne calculée, l'erreur indique: 

"Seules des contraintes UNIQUE ou PRIMARY KEY peuvent être créées sur des colonnes calculées, tandis que les contraintes CHECK, FOREIGN KEY et NOT NULL nécessitent la conservation des colonnes calculées" 

OK, si pour continuer ce jeu de devinettes, voici mon script illustrant l’ajout de la colonne "NOT NULL" en une étape "ALTER TABLE": 

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;

Non, vous ne pouvez pas, en tant que SQL Server, ni aucun autre moteur de base de données forcer cette nouvelle colonne à être nul pour les lignes existantes de votre table de données. Mais comme 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 sens! Le DBE n'extrapolera pas une valeur pour des valeurs non NULL pour les lignes existantes.

0
Will Marcouiller