为什么使用命名键约束(例如:外键)

时间:2013-03-12 19:22:30

标签: sql

我对SQL不是很熟悉,请解释一下以下两者的区别以及最佳使用方法。使用一个优于另一个是否有任何优势。

CREATE TABLE Employee
(
    Emp_Id int NOT NULL,
    Dep_Id int NOT NULL,
    ...
    FOREIGN KEY (Dep_Id) REFERENCES Department(Dep_Id)
);

CREATE TABLE Employee
(
    Emp_Id int NOT NULL,
    Dep_Id int NOT NULL,
    ...

    CONSTRAINT fk_EmpDept FOREIGN KEY (Dep_Id) REFERENCES Department(Dep_Id)
);

4 个答案:

答案 0 :(得分:0)

唯一的区别在于命名。如果没有为约束明确设置名称,则它将具有自动生成的名称。例如:FK_ 员工 _Dep_Id__164452B1。你会在表键的描述中看到这个名字,在不同的例外等等。

答案 1 :(得分:0)

如果未命名外键,则db会隐式为该字段指定外键名称。

如果您命名外键,则db将其用作外键常量名。

您可以使用drop FOREIGN KEY foreign_key_name删除约束(对于MySql)。

您可以使用drop constraint foreign_key_name删除约束(对于Oracle,MS Sql等)。

您可以使用

ALTER TABLE TableName
ADD CONSTRAINT foreign_key_name
FOREIGN KEY (field)
REFERENCES foreign_key_table(Foreign_key_field)

答案 2 :(得分:0)

在MySQL中使用FOREIGN KEY (Dep_Id) REFERENCES Department(Dep_Id)的第一个示例,它不允许您为此约束指定特定名称。

在使用CONSTRAINT fk_EmpDept FOREIGN KEY (Dep_Id) REFERENCES Department(Dep_Id)的第二个示例中,您可以将fk_EmpDept更改为您想要的任何名称。 它可以在MySQL,SQL Server,Oracle,MS Access中使用。

使用第二个版本,您还可以在多个列上创建外键约束。

答案 3 :(得分:0)

我总是命名我的键和约束,通常有足够的信息,任何看着键名的人都能够理解的关键字。

  • 外键我命名为FK_FieldName@TableName
  • 我将主要密钥命名为PKC_TableNamePKN_TableName(" c"代表"群集"" n"代表"非聚集",虽然这不重要)。
  • 对于索引,我根据它们的独特性,聚集性以及" I"来命名它们。索引,例如UNI_FieldName@TableName

命名的原因是为了方便您是否需要删除对象,更重要的是,如果代码中的某些内容试图违反关系/约束。问题显而易见,如果您收到消息说您已经发现密钥违反密钥FK_FieldName@TableName,但如果名称没有意义则不太清楚