我对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)
);
答案 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_TableName
或PKN_TableName
(" c"代表"群集"" n"代表"非聚集",虽然这不重要)。UNI_FieldName@TableName
。命名的原因是为了方便您是否需要删除对象,更重要的是,如果代码中的某些内容试图违反关系/约束。问题显而易见,如果您收到消息说您已经发现密钥违反密钥FK_FieldName@TableName
,但如果名称没有意义则不太清楚