在下面的表定义中,这两个列定义有什么区别,或者第二个只是创建一个自动命名的外键索引?
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 ... */
);
答案 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字段编入索引(并且大多数时间都这样做),则需要在字段上创建索引。