Comment définir une valeur par défaut pour une colonne existante

375

Cela ne fonctionne pas dans SQL Server 2008:

ALTER TABLE Employee ALTER COLUMN CityBorn SET DEFAULT 'SANDNES'

L'erreur est:

Syntaxe incorrecte près du mot clé "SET".

Qu'est-ce que je fais mal?

Nakul Chaudhary
la source
1
Qu'avez-vous lu sur MSDN ALTER TABLE ...? msdn.microsoft.com/en-us/library/ms187742(SQL.90).aspx
GBN
1
C'est la syntaxe mysql.
Benjamin Goodacre
pourquoi tout le monde ne peut-il pas simplement s'en tenir à une norme? (pas une vraie question, tout le monde se réfère à Microsoft et à MySQL ou à d'autres fournisseurs). existe-t-il même une méthode standard ansi / iso pour ce faire?
joedotnot

Réponses:

566

Cela fonctionnera dans SQL Server:

ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
Beurk
la source
62
+1 pour spécifier un nom de contrainte, afin que SQL Server n'en crée pas un au hasard.
HardCode
36
MSSQL est bizarre pour appeler des valeurs par défaut "contraintes". Au contraire, ce sont des relaxations ; l' opposé d'une contrainte! Ils rendent plus de choses valables, pas moins.
Roman Starkov
4
Ce n'est pas bizarre si vous pensez d'une manière alternative comme: La contrainte par défaut empêche MSSQL de générer une erreur si vous ne spécifiez pas la colonne. Ce n'est donc pas une contrainte pour l'utilisateur, mais c'est une contrainte pour MSSQL.
Jonny Piazzi
4
Cela ne fonctionne que s'il n'y a pas de contrainte par défaut existante sur la colonne.
pmcilreavy
4
@fallenidol Cela ne fonctionne que s'il n'y a pas de contrainte par défaut existante sur la colonne. Oui, parce que par définition, vous ne pouvez pas avoir plus d'une valeur par défaut ...
Beurk
165
ALTER TABLE Employee ADD DEFAULT 'SANDNES' FOR CityBorn
hoodaticus
la source
3
Cela fonctionne dans MSSQL, mais il a l'inconvénient de ne pas nommer la contrainte qu'il crée en arrière-plan (voir la réponse la plus votée ci-dessus).
Contango
10
@Contango Je pense qu'il vaut mieux ne pas prendre la peine de nommer toutes les contraintes sur la tâche dont vous avez besoin pour modifier l'une d'entre elles. Écrivez simplement une procédure pour supprimer les contraintes nommées automatiquement et vous n'aurez plus jamais à en nommer une + vous pourrez gérer toutes les autres sans nom
JonnyRaa
3
@Jonny Leeds. Bon point. J'aime également nommer les contraintes, car c'est une bonne documentation pour quiconque essaie de modifier (ou simplement de comprendre) le schéma de la base de données. Ceci est moins important si l'on est un opérateur solo travaillant en équipe.
Contango
1
(EESH! Désolé pour le manque de sauts de ligne - collé ci-dessous pour plus de clarté!) J'avais besoin qu'il soit réexécutable et j'ai trouvé ce moyen de vérifier si cela avait déjà été fait ... SI EXISTE (SÉLECTIONNEZ * CHEZ information_schema.columns OERE table_name = 'myTable' AND column_name = 'myColumn' AND Table_schema = 'myDBO' AND column_default IS NULL) BEGIN ALTER TABLE [myDBO]. [myTable] ADD DEFAULT 0 FOR [myColumn] END
Dave
4
S'il n'y a qu'une seule contrainte par défaut ... pourquoi devez-vous la nommer? Il semble que d'autres moteurs de base de données fournissent une syntaxe pour ajouter, mettre à jour et supprimer la valeur par défaut d'une colonne sans autre nom que le nom de la colonne, ce qui est logique. Le code ci-dessus échoue, btw, s'il existe déjà une valeur par défaut. Il est ridicule que SQL Server nécessite une jointure complexe contre une table système juste pour identifier le nom de la contrainte par défaut, ce qui ne devrait pas être nécessaire car il ne peut y avoir qu'une seule contrainte par défaut sur une colonne.
Triynko
51

ne peut pas utiliser alter colonne pour cela, utilisez plutôt add

ALTER TABLE Employee 
ADD DEFAULT('SANDNES') FOR CityBorn
Carlos Quintanilla
la source
9
Je ne sais pas pourquoi cette réponse n'obtient pas de votes positifs. C'est exactement la même que la précédente et on y a répondu plus tôt ...
spankmaster79
30

La bonne façon de procéder est la suivante:

  1. Exécutez la commande:

    sp_help [table name] 
  2. Copiez le nom du fichier CONSTRAINT.

  3. Déposez le DEFAULT CONSTRAINT:

    ALTER TABLE [table name] DROP [NAME OF CONSTRAINT] 
  4. Exécutez la commande ci-dessous:

    ALTER TABLE [table name] ADD DEFAULT [DEFAULT VALUE] FOR [NAME OF COLUMN]
user3310402
la source
4
StackOverflow.com est uniquement en anglais. Le site portugais est pt.stackoverflow.com
Martin Smith
Cela n'ajoute rien de nouveau aux autres réponses, est une méthode manuelle - ne peut pas être scripté, et il indique que "la bonne façon" ..
Andre Figueiredo
12

La solution de Hoodaticus était parfaite, merci, mais j'avais également besoin qu'elle soit réexécutable et j'ai trouvé ce moyen de vérifier si cela avait été fait ...

IF EXISTS(SELECT * FROM information_schema.columns 
           WHERE table_name='myTable' AND column_name='myColumn' 
             AND Table_schema='myDBO' AND column_default IS NULL) 
BEGIN 
  ALTER TABLE [myDBO].[myTable] ADD DEFAULT 0 FOR [myColumn] --Hoodaticus
END
Dave
la source
7

Il existe deux scénarios dans lesquels la valeur par défaut d'une colonne pourrait être modifiée,

  1. Au moment de la création de la table
  2. Modifier la colonne existante pour une table existante.

  1. Au moment de créer la table / créer une nouvelle colonne.

Requete

create table table_name
(
    column_name datatype default 'any default value'
);
  1. Modifier une colonne existante pour une table existante

Dans ce cas, mon serveur SQL ne permet pas de modifier la valeur de contrainte par défaut existante. Donc, pour changer la valeur par défaut, nous devons supprimer la contrainte par défaut générée par le système ou générée par l'utilisateur. Et après cette valeur par défaut peut être définie pour une colonne particulière.

Suivez quelques étapes:

  1. Répertorie toutes les contraintes de valeur par défaut existantes pour les colonnes.

Exécutez cette procédure de base de données système, elle prend le nom de la table comme paramètre. Il renvoie la liste de toutes les contraintes pour toutes les colonnes de la table.

execute [dbo].[sp_helpconstraint] 'table_name'
  1. Supprimez la contrainte par défaut existante pour une colonne.

Syntaxe:

alter table 'table_name' drop constraint 'constraint_name'
  1. Ajoutez une nouvelle contrainte de valeur par défaut pour cette colonne:

Syntaxe:

alter table 'table_name' add default 'default_value' for 'column_name'

à votre santé @!!!

Sunil Sharma
la source
5

dans le cas où une restriction existe déjà avec son nom par défaut:

-- Drop existing default constraint on Employee.CityBorn
DECLARE @default_name varchar(256);
SELECT @default_name = [name] FROM sys.default_constraints WHERE parent_object_id=OBJECT_ID('Employee') AND COL_NAME(parent_object_id, parent_column_id)='CityBorn';
EXEC('ALTER TABLE Employee DROP CONSTRAINT ' + @default_name);

-- Add default constraint on Employee.CityBorn
ALTER TABLE Employee ADD CONSTRAINT df_employee_1 DEFAULT 'SANDNES' FOR CityBorn;
tibx
la source
4
ALTER TABLE [dbo].[Employee] ADD  DEFAULT ('N') FOR [CityBorn]
fendre
la source
4

Vous pouvez utiliser la syntaxe suivante. Pour plus d'informations, consultez cette question et réponses: Ajouter une colonne avec une valeur par défaut à une table existante dans SQL Server

Syntaxe:

ALTER TABLE {TABLENAME} 
ADD {COLUMNNAME} {TYPE} {NULL|NOT NULL} 
CONSTRAINT {CONSTRAINT_NAME} DEFAULT {DEFAULT_VALUE}
WITH VALUES

Exemple :

ALTER TABLE SomeTable
ADD SomeCol Bit NULL --Or NOT NULL.
CONSTRAINT D_SomeTable_SomeCol --When Omitted a Default-Constraint Name is 
autogenerated.
DEFAULT (0)--Optional Default-Constraint.
WITH VALUES --Add if Column is Nullable and you want the Default Value for Existing Records.

Autrement :

Faites un clic droit sur la table et cliquez sur Conception, puis cliquez sur la colonne que vous souhaitez définir la valeur par défaut.

Ensuite, en bas de page, ajoutez une valeur par défaut ou une liaison: quelque chose comme «1» pour la chaîne ou 1 pour l'int.

Mohamad Reza Shahrestani
la source
3

3 étapes simples pour modifier une colonne déjà existante qui était nulle avant

update   orders
set BasicHours=0 where BasicHours is null

alter table orders 
add default(0) for BasicHours

alter table orders 
alter  column CleanBasicHours decimal(7,2) not null 
David Fawzy
la source
3

Contraintes de première chute

https://stackoverflow.com/a/49393045/2547164

DECLARE @ConstraintName nvarchar(200)
SELECT @ConstraintName = Name FROM SYS.DEFAULT_CONSTRAINTS
WHERE PARENT_OBJECT_ID = OBJECT_ID('__TableName__')
AND PARENT_COLUMN_ID = (SELECT column_id FROM sys.columns
                        WHERE NAME = N'__ColumnName__'
                        AND object_id = OBJECT_ID(N'__TableName__'))
IF @ConstraintName IS NOT NULL
EXEC('ALTER TABLE __TableName__ DROP CONSTRAINT ' + @ConstraintName)

Deuxième créer la valeur par défaut

ALTER TABLE [table name] ADD DEFAULT [default value] FOR [column name]
Mise
la source
2

Essayez la commande suivante;

ALTER TABLE Person11
ADD CONSTRAINT col_1_def
DEFAULT 'This is not NULL' FOR Address
Hasna Ashraf
la source
1

Comme la réponse de Yuck avec une vérification pour permettre au script d'être exécuté plus d'une fois sans erreur. (moins de code / chaînes personnalisées que l'utilisation de information_schema.columns)

IF object_id('DF_SomeName', 'D') IS NULL BEGIN
    Print 'Creating Constraint DF_SomeName'
   ALTER TABLE Employee ADD CONSTRAINT DF_SomeName DEFAULT N'SANDNES' FOR CityBorn;
END
ScottFoster1000
la source