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 „”


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.


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


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

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
Korzystając z naszej strony potwierdzasz, że przeczytałeś(-aś) i rozumiesz nasze zasady używania plików cookie i zasady ochrony prywatności.
Licensed under cc by-sa 3.0 with attribution required.