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