Come aggiungere un vincolo predefinito durante la creazione di una tabella? SQL Server [chiuso]


12

Sto cercando di creare una nuova tabella con colonne seguite dal loro vincolo, come mostrato di seguito.

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

Tuttavia, visualizzo un messaggio di errore vicino al vincolo predefinito come,

'Sintassi errata vicino a' per ''


Potresti voler dare un'occhiata alla documentazione ufficiale di Microsoft SQL Server per la CREATE TABLE ...dichiarazione. Hai un errore di sintassi molto semplice.
John aka hot2use

Risposte:


20

È possibile nominare il vincolo in linea:

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

Come CREATE TABLEmostra la pagina msdn:

DEFAULT

... Per mantenere la compatibilità con le versioni precedenti di SQL Server, è possibile assegnare un nome di vincolo a a DEFAULT.

Nella stessa pagina, possiamo trovare che le uniche opzioni per <table_constraint>sono PRIMARY KEY, FOREIGN KEYe CHECKvincoli:

< 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 )   
}

quindi se si desidera aggiungere un vincolo predefinito (denominazione o meno), gli unici modi sono eseguendolo in linea o con ALTER TABLEun'istruzione.


Voglio nominare il mio vincolo, il che non sarebbe possibile se lo facessi in linea. C'è un modo senza usare l'istruzione inline o alter table.
Dhruv Raj,

4
@DhruvRaj - è possibile come mostra questa risposta
Martin Smith,

8

I tuoi commenti sulle altre due risposte affermano che non puoi nominare un vincolo predefinito quando lo crei "in linea". Entrambe le risposte mostrano che è possibile, in effetti, fornire un nome per il vincolo durante la creazione in linea. Aggiungerò un terzo esempio, mostrando i risultati.

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;

Questo mostra che il nome del vincolo predefinito è 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;

risultati:

inserisci qui la descrizione dell'immagine

Guardando Esplora oggetti in SSMS mostra il nome:

inserisci qui la descrizione dell'immagine


2

È possibile utilizzare default valuesulla definizione del campo.

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

Oppure usa ALTER TABLE:

ALTER TABLE tblTest
ADD CONSTRAINT constraint_name 
DEFAULT 3
FOR Gender

Voglio nominare il mio vincolo, il che non sarebbe possibile se lo facessi in linea. C'è un modo senza usare l'istruzione inline o alter table.
Dhruv Raj,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.