ADD FOREIGN KEY和ADD CONSTRAINT fk_foreign_key之间的区别

5
在MySQL中,以下操作会:
alter table TABLE_A 
ADD CONSTRAINT fk_id (id) REFERENCES TABLE_B(id) 
ON DELETE CASCADE ON UPDATE CASCADE;

执行与之前相同的操作

alter table TABLE_A 
ADD FOREIGN KEY (id) REFERENCES TABLE_B(id);

除此之外,它还在关系上添加了一个BTREE索引?还是它们互补?

第一个真的有效吗?你不是忘了在其中加入“foreign key”关键字吗?如果是这样,那么两者之间的区别仅在于第一个使用用户定义的名称创建FK,否则MySQL会为约束生成一个名称。 - user330315
2
据我所知,它们是相同的东西;CONSTRAINT子句允许自定义名称,否则MySQL会选择一个唯一键。但是,“FOREIGN KEY”这个术语是必需的。 - Ja͢ck
@Jack 在MySQL5中,即使我没有添加FOREIGN KEY,它仍然可以工作。这只适用于Oracle或其他什么吗? - bicycle
@Michael 不确定,它在手册中是这样说的 :) - Ja͢ck
@Jack 谢谢,我会把两个都放上以确保安全。请将其作为答案发布,我会点击接受。 - bicycle
另外,ON DELETE CASCADEON UPDATE CASCADE之间不应该有逗号。 - ypercubeᵀᴹ
2个回答

5

这两个查询基本相同,不过根据手册的说明,FOREIGN KEY应该在两个查询中都存在。

[CONSTRAINT [symbol]] FOREIGN KEY
[index_name] (index_col_name, ...)
REFERENCES tbl_name (index_col_name,...)
[ON DELETE reference_option]
[ON UPDATE reference_option]
CONSTRAINT [symbol] 的好处是可以为约束命名,而不是由MySQL自动生成名称;该符号在数据库中必须是唯一的,并且可以用于随后删除约束。创建后可以通过检查表结构来查看生成的符号名称。
SHOW CREATE TABLE TABLE_A;

0

约束语法纯粹是为了命名目的,以便您可以在表的任何其他列中使用该名称来实现约束。

您对该问题的答案


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接