2011-09-06 4 views
0

다음 표 정의에서 두 열 정의의 차이점은 무엇입니까? 아니면 두 번째 열 정의는 자동으로 명명 된 외래 키 색인을 만듭니 까?외래 키를 정의하는 두 가지 방법이 다른가요?

CREATE TABLE dbo.Employee 
(
    dept_id  int NOT NULL 
     CONSTRAINT fk_employee_deptid FOREIGN KEY REFERENCES Department(dept_id), 
    empType_id int NOT NULL REFERENCES EmployeeType(empType_id) 
    /* ... other columns ... */ 
); 
+3

외래 키 제약 조건은 최적화 프로그램을 도울 수 있지만 기술적 인 인덱스는 아닙니다. –

+1

SQL Server의 외래 키에 대해 ** 인덱스 **가 자동으로 생성되지 않습니다. 참고 : [외래 키가 자동으로 색인을 생성합니까?] (http://stackoverflow.com/questions/836167/does-a-foreign-key-automatically-create-an-index/836176#836176) –

+0

감사합니다. 색인에 대한 설명. – Squirrelsama

답변

2

유일한 차이점은 시스템에 생성 된 이름이 주어지기 때문에 자신이 할당 한 것보다 더 복잡 할 수 있습니다.

명확한 가능성이있는 경우 열 이름도 선택 사항입니다.

empType_id int NOT NULL REFERENCES EmployeeType 

도 사용할 수 있습니다. 다시 최종 결과에 차이가 없습니다. FK 선언에 대한 full grammar

[ CONSTRAINT constraint_name ] 
{  [ FOREIGN KEY ] 
     REFERENCES [ schema_name . ] referenced_table_name [ (ref_column) ] 
     [ ON DELETE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
     [ ON UPDATE { NO ACTION | CASCADE | SET NULL | SET DEFAULT } ] 
     [ NOT FOR REPLICATION ] 
} 

옵션 항목은 대괄호로 묶입니다.

+3

젠장, 너의 어깨 너머로 독서를 의심 할 지, 아니면 너를 읽고 읽는지 의심 스럽다. :-) –

2

유일한 차이점은 후자의 경우 시스템 정의 이름을 얻는 것입니다. 전자가 게으르다는 것을 인정할 것이지만 때때로 후자를 사용할 것입니다.

너가주의 깊게 보는 경우에, 너는 너 자신에게 이름을 지정하지 않으면 란 sys.foreign_keys.is_system_named가 1에 놓인다는 것을주의 할 다른 1 개의 차이.

1

그리고 두 번째 질문에 대한 대답으로 둘 다 색인을 만들지 않습니다. FK 필드를 인덱싱하려면 (그리고 대부분의 경우) 필드에 인덱스를 만들어야합니다.

+0

추가 답변을 제공해 주셔서 감사합니다. – Squirrelsama