2011-09-06 71 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

並回答你的第二個問題,既不創建索引。如果您希望將FK字段編入索引(並且大部分時間您都需要),那麼您需要在該字段上創建索引。

+0

謝謝你的補充答案。 – Squirrelsama