La meilleure façon d'ajouter une nouvelle colonne avec une première (mais pas par défaut) valeur?
J'ai besoin d'ajouter une nouvelle colonne à une base de données MS SQL 2005 avec une valeur initiale. Cependant, je ne veux PAS créer automatiquement une contrainte par défaut sur cette colonne. Au moment que j'ajoute une colonne la valeur par défaut est correct, mais cela peut changer au fil du temps. Donc, à l'avenir l'accès à la table DOIT spécifier une valeur, au lieu d'accepter un défaut.
Du mieux que je pouvais venir avec est:
ALTER TABLE tbl ADD col INTEGER NULL
UPDATE tbl SET col = 1
ALTER TABLE tbl ALTER COLUMN col INTEGER NOT NULL
Cela semble un peu inefficace pour largish tables (de 100 000 à 1 000 000 enregistrements).
J'ai expérimenté avec l'ajout de la colonne avec une valeur par défaut, puis la suppression de la contrainte par défaut. Cependant, je ne sais pas quel est le nom de la contrainte par défaut est et serait plutôt de ne pas l'accès sysobjects et les mettre dans la base de données des connaissances spécifiques.
S'il vous plaît, il doit y avoir une meilleure façon.
Vous devez vous connecter pour publier un commentaire.
J'avais
ALTER TABLE tbl ADD col INTEGER CONSTRAINT tempname DEFAULT 1
d'abord, et laisser le explicitement nommé contrainte après (probablement au sein d'une transaction).Pour ajouter la colonne avec une valeur par défaut et supprimez la valeur par défaut, vous pouvez donner un nom par défaut:
Ce rempli la valeur 1, mais quitte la table sans défaut. À l'aide de SQL Server 2008, j'ai couru ce et votre code, de
alter update alter
et ne voit pas de différence notable sur une table de 100 000 de petites lignes. SSMS voudrais pas me montrer les plans de requête pour les instructions alter table, je n'étais donc pas en mesure de comparer les ressources utilisées entre les deux méthodes.Vous pouvez le faire dans un déclencheur d'insertion
Un autre, peut-être plus authentique, le plus serait:
Je ne suis pas sûr combien de temps cette fonction existe, mais la Documentation PostgreSQL remonte à la version 7.1 et 7.1 il est déjà décrit.
Si vous ajoutez une contrainte par défaut lors de la création de la table, vous ne saurez pas à quoi il est appelé. Toutefois, si vous ajoutez une contrainte avec ALTER TABLE, vous devez le nom de la contrainte. Dans ce cas, vous seriez en mesure de ALTER TABLE DROP CONSTRAINT (Cela s'applique T-SQL, ce n'est pas sûr d'autres bases de données.)
Cependant, ce serait vous obliger à CRÉER une TABLE avec colonne NULL, ALTER TABLE pour ajouter la contrainte, de rendre la colonne not NULL, et enfin la CHUTE de CONTRAINTE.
Je ne crois pas un déclencheur d'insertion serait de travailler pour quelqu'un d'autre a mentionné, parce que vos lignes sont déjà ajoutés.
Je pense que la façon dont vous décrivez peut, en fait, être la plus efficace et la plus élégante solution.