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 ... */
);
4

3 回答 3

3

唯一的区别是第二个将被赋予一个系统生成的名称,该名称可能比您自己分配的名称更神秘。

如果存在明确的可能性,列名也是可选的。

empType_id  int  NOT NULL  REFERENCES  EmployeeType

也可以工作。最终结果再次没有区别。FK 声明的完整语法

[ 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 ] 
 } 

可选项目括在方括号中。

于 2011-09-06T21:16:16.310 回答
3

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

如果您仔细观察,您会注意到的另一个区别是,sys.foreign_keys.is_system_named如果您自己不指定名称,则该列设置为 1。

于 2011-09-06T21:18:12.987 回答
2

在回答您的第二个问题时,两者都没有创建索引。如果您希望 FK 字段被索引(并且大多数时候您这样做),那么您需要在该字段上创建一个索引。

于 2011-09-06T21:55:13.430 回答