테이블 생성시 기본 제약 선언


100

GUI를 사용하는 대신 코드를 작성하여 Microsoft SQL Server 2000에서 새 테이블을 만들고 있습니다. "수동 방식"으로 수행하는 방법을 배우려고합니다.

이것은 내가 실제로 사용하고있는 코드이며 잘 작동합니다.

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE())
)

이 방법으로 이름을 정의 할 수 있기 때문에 기본 키, 외래 키 및 검사 제약 조건을 자체적으로 지정했습니다. 그렇지 않으면 인라인으로 선언하면 SQL Server가 임의의 이름을 생성하고 "좋아요"하지 않습니다.

기본 값 제약 조건을 선언하려고 할 때 문제가 발생했습니다. 인터넷의 정보와 Microsoft SLQ Server Management Studio가이를 생성하는 방법을 살펴보면 인라인 및 자체적으로 생성 될 수 있음을 이해했습니다.

"load_date" SMALLDATETIME NOT NULL DEFAULT GETDATE()

또는

CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"

인라인 메서드는 잘 작동하지만 일반적으로 constaint에 대한 임의의 이름을 생성하고 독립형 메서드는 오류를 발생시킵니다 Incorrect syntax near 'FOR'..

또한 테이블을 만든 다음 ALTER해당 명령이 작동합니다.

ALTER TABLE "attachments"
ADD CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"


참고로 실행하려는 전체 코드는 다음과 같습니다.

CREATE TABLE "attachments"
(
    "attachment_id" INT NOT NULL,
    "load_date" SMALLDATETIME NOT NULL,
    "user" VARCHAR(25) NOT NULL,
    "file_name" VARCHAR(50) NOT NULL,
    CONSTRAINT "pk_attachments" PRIMARY KEY ("attachment_id"),
    CONSTRAINT "fk_users" FOREIGN KEY ("user") REFERENCES "users" ("user"),
    CONSTRAINT "ch_load_date" CHECK ("load_date" < GETDATE()),
    CONSTRAINT "df_load_date" DEFAULT GETDATE() FOR "load_date"
)



나는 여기서 완전히 헤매고있다. 내가하려는 것이 불가능한가, 아니면 내가 뭔가 잘못하고 있는가?


편집하다:

David M은 인라인 구문을 사용하여 명명 된 기본 제약 조건을 추가하는 방법을 보여 주었지만 독립형 구문이 완전히 잘못되었는지 아니면 내 잘못인지 이해하려고합니다.


3
편집에 동의합니다. David M의 응답은 독립 실행 형 제약 선언을 통해 제약 조건을 추가하는 방법을 다루지 않지만 BOL에는 David M이 시연 한 방식을 제외하고 기본 제약 조건의 이름을 지정할 수있는 예가 없으므로 SQL을 가정하는 것이 안전하다고 생각합니다. 서버 (일관되지 않음)는이 구문을 지원하지 않습니다.
Peter Majeed

1
참고 항목 : '
for'SQL

답변:


177

열 생성과 함께 인라인으로 수행하십시오.

[load_date] SMALLDATETIME NOT NULL
        CONSTRAINT [df_load_date] DEFAULT GETDATE()

많은 독자가 QUOTED_IDENTIFIERS기본적으로 작동하지 않으므로 따옴표 대신 대괄호를 사용 했습니다.


3
감사합니다. 이름 문제가 해결되었습니다. 이제 나는이 동작이 "의도적으로"(즉, 할 수 없는지) 또는 할 방법이 있는지 알아 내려고합니다. 알다시피, 저는 제 코드를 "정리"로 유지하고 열 뒤에 제약 조건을 선언하면 SQL 파일을 더 명확하고 이해하고 디버그하기 쉽게 만듭니다 (또는 적어도 제가 생각하는 것입니다).
Albireo

3
@Albireo-의도적으로. table_constraint문법 에 포함되지 않습니다DEFAULT
마틴 스미스

2
이 솔루션은 필드 및 제약 조건 이름 주위의 따옴표를 제거하는 경우에만 작동합니다.
David S.

1
최신 버전의 SQL Server에서는 [load_date] SMALLDATETIME NOT NULL CONSTRAINT [df_load_date] DEFAULT GETDATE(). 큰 따옴표 대신 대괄호를 확인하십시오.
deadlydog 2015-08-05

3
실제로 최신 / 이전 버전이 아닙니다 SET QUOTED_IDENTIFIER. 어쨌든 대괄호를 선호하기 때문에 답변을 수정할 것입니다. OP의 질문 스타일을 따랐습니다.
David M
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.