这两种定义外键的方式有何不同?

时间:2011-09-06 21:13:55

标签: sql sql-server foreign-keys create-table

在下面的表定义中,这两个列定义有什么区别,或者第二个只是创建一个自动命名的外键索引?

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 个答案:

答案 0 :(得分: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 ] 
 } 

可选项目用方括号括起来。

答案 1 :(得分:2)

唯一真正的区别是后者将获得系统定义的名称。前者是推荐的方法,但我承认我很懒,偶尔使用后者。

如果您仔细观察,您会注意到另一个不同之处是,如果您自己未指定名称,则列sys.foreign_keys.is_system_named将设置为1。

答案 2 :(得分:1)

在回答你的第二个问题时,既没有创建索引。如果要将FK字段编入索引(并且大多数时间都这样做),则需要在字段上创建索引。

相关问题