Jak dodać ograniczenie domyślne podczas tworzenia tabeli? SQL Server [zamknięty]

12

Próbuję utworzyć nową tabelę z kolumnami i ich ograniczeniem, jak pokazano poniżej.

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

Jednak pojawia się komunikat o błędzie w pobliżu domyślnego ograniczenia, ponieważ:

„Niepoprawna składnia w pobliżu” dla „”

Dhruv Raj
źródło
Możesz zajrzeć do oficjalnej dokumentacji Microsoft SQL Server dla tego CREATE TABLE ...oświadczenia. Występuje bardzo podstawowy błąd składniowy.
John aka hot2use

Odpowiedzi:

20

Możesz nazwać ograniczenie wbudowane:

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

Jak CREATE TABLEpokazuje strona msdn:

DEFAULT

... Aby zachować zgodność z wcześniejszymi wersjami SQL Server, nazwę ograniczenia można przypisać do DEFAULT.

Na tej samej stronie, możemy stwierdzić, że jedyne opcje <table_constraint>PRIMARY KEY, FOREIGN KEYi CHECKograniczenia:

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

więc jeśli chcesz dodać domyślne ograniczenie (nazewnictwo lub nie), jedynym sposobem jest zrobienie tego w linii lub za pomocą ALTER TABLEinstrukcji.

ypercubeᵀᴹ
źródło
Chcę nazwać moje ograniczenie, co nie byłoby możliwe, jeśli zrobię to bezpośrednio. Czy istnieje sposób bez użycia instrukcji inline lub alter table.
Dhruv Raj
4
@DhruvRaj - jest to możliwe, jak pokazuje ta odpowiedź
Martin Smith
8

Twoje komentarze do pozostałych dwóch odpowiedzi twierdzą, że nie można nazwać domyślnego ograniczenia podczas tworzenia go „w linii”. Obie odpowiedzi pokazują, że w rzeczywistości można podać nazwę ograniczenia podczas tworzenia go bezpośrednio. Dodaję trzeci przykład, pokazujący wyniki.

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;

To pokazuje nazwę domyślnego ograniczenia 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;

Wyniki:

wprowadź opis zdjęcia tutaj

Patrząc na eksplorator obiektów w SSMS pokazuje nazwę:

wprowadź opis zdjęcia tutaj

Max Vernon
źródło
2

Możesz użyć default valuedefinicji pola.

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

Lub użyj ALTER TABLE:

ALTER TABLE tblTest
ADD CONSTRAINT constraint_name 
DEFAULT 3
FOR Gender
McNets
źródło
Chcę nazwać moje ograniczenie, co nie byłoby możliwe, jeśli zrobię to bezpośrednio. Czy istnieje sposób bez użycia instrukcji inline lub alter table.
Dhruv Raj