Comment ajouter une contrainte par défaut lors de la création d'une table? SQL Server [fermé]

12

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 ''

Dhruv Raj
la source
Vous souhaiterez peut-être consulter la documentation officielle de Microsoft SQL Server pour l' CREATE TABLE ...instruction. Vous avez une erreur de syntaxe très basique.
John aka hot2use

Réponses:

20

Vous pouvez nommer la contrainte en ligne:

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

Comme le CREATE TABLEmontre la page msdn:

DEFAULT

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

Dans la même page, on peut trouver que les seules options pour <table_constraint>sont PRIMARY KEY, FOREIGN KEYet les CHECKcontraintes:

< 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 une ALTER TABLEinstruction.

ypercubeᵀᴹ
la source
Je veux nommer ma contrainte, ce qui ne serait pas possible si je le fais en ligne. Existe-t-il un moyen sans utiliser l'instruction inline ou alter table.
Dhruv Raj
4
@DhruvRaj - c'est possible comme le montre cette réponse
Martin Smith
8

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:

entrez la description de l'image ici

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

entrez la description de l'image ici

Max Vernon
la source
2

Vous pouvez utiliser default valuesur 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
McNets
la source
Je veux nommer ma contrainte, ce qui ne serait pas possible si je le fais en ligne. Existe-t-il un moyen sans utiliser l'instruction inline ou alter table.
Dhruv Raj