web-dev-qa-db-fra.com

Comment ajouter une contrainte par défaut lors de la création d'une table? serveur SQL

J'essaie de créer un nouveau tableau avec des colonnes suivies de leur contrainte comme indiqué ci-dessous.

Create tblTest(
columns..
..
..
Gender int,
Constraint DF_tblTest_Gender Default 3 For Gender,
..
..
..
)

Cependant, je reçois un message d'erreur près de la contrainte par défaut,

'Syntaxe incorrecte près de' pour ''

11
Dhruv Raj

Vous pouvez nommer la contrainte en ligne:

CREATE TABLE tblTest(
  --
  --
  Gender int CONSTRAINT DF_tblTest_Gender DEFAULT 3,
  --
) ;

Comme CREATE TABLE La page msdn affiche:

DEFAULT

... Pour conserver la compatibilité avec les versions antérieures de SQL Server, un nom de contrainte peut être attribué à un DEFAULT.

Dans la même page, nous pouvons constater que les seules options pour <table_constraint> sont PRIMARY KEY, FOREIGN KEY et CHECK contraintes:

< table_constraint > ::=  
  [ CONSTRAINT constraint_name ]   
{  
   { PRIMARY KEY | UNIQUE }  
       {   
         NONCLUSTERED (column [ ASC | DESC ] [ ,... n ])  
         | NONCLUSTERED HASH (column [ ,... n ] ) 
               WITH ( BUCKET_COUNT = bucket_count )   
       }   
    | FOREIGN KEY   
        ( column [ ,...n ] )   
        REFERENCES referenced_table_name [ ( ref_column [ ,...n ] ) ]   
    | CHECK ( logical_expression )   
}

donc si vous voulez ajouter une contrainte par défaut (nommer ou non) les seules façons sont de le faire en ligne ou avec un ALTER TABLE déclaration.

20
ypercubeᵀᴹ

Vos commentaires sur les deux autres réponses affirment que vous ne pouvez pas nommer une contrainte par défaut lors de sa création "en ligne". Les deux réponses montrent que vous pouvez, en fait, donner un nom à la contrainte lors de sa création en ligne. J'ajouterai un troisième exemple, montrant les résultats.

IF OBJECT_ID('dbo.Test') IS NOT NULL
DROP TABLE dbo.Test;
CREATE TABLE dbo.Test
(
    TestID int NOT NULL
        CONSTRAINT PK_Test --here I'm naming the primary key constraint!
        PRIMARY KEY CLUSTERED
        IDENTITY(1,1)
    , SomeData varchar(42) NOT NULL
        CONSTRAINT DF_Test_SomeData --this is the name of the default constraint!
        DEFAULT ('Carrie Fisher')
);

INSERT INTO dbo.Test DEFAULT VALUES;

Cela montre que le nom de la contrainte par défaut est DF_Test_SomeData:

SELECT TableName = t.name
    , ConstraintName = dc.name
FROM sys.default_constraints dc
    INNER JOIN sys.tables t ON dc.parent_object_id = t.object_id;

Résultats:

enter image description here

L'examen de l'explorateur d'objets dans SSMS montre le nom:

enter image description here

8
Max Vernon

Vous pouvez utiliser default value sur la définition du champ.

Create tblTest(
columns..
..
..
Gender int CONSTRAINT constraint_name DEFAULT 3,
..
..
..
)

Ou utilisez ALTER TABLE:

ALTER TABLE tblTest
ADD CONSTRAINT constraint_name 
DEFAULT 3
FOR Gender
2
McNets