为什么在 MySQL 中的列级别定义时不创建外键?

Why foreign key is not created when defined at column level in MySQL?

我使用以下 SQL 命令创建了一个名为 'Student' 的父级 Table,它有两列 'rollno' 和 'name':

创造table个学生 ( rollno int 主键, 名称字符(30) );

我在列级别定义了主约束并创建了主键。但是,当我使用以下 SQL 命令创建包含 'rollno' 和 'marks' 两列的子 table 'Score' 时:

创造 table 分数 ( rollno int 引用学生(rollno), 标记整数 );

未创建外键(在列级别定义时)。我也没有收到任何错误。如果我在 table 级别应用外键约束,则会创建外键。

所以,我的疑问是为什么在列级定义时不创建外键,而在列级定义时创建主键?

我正在使用最新版本的 MySQL。

这是 MySQL 中的功能请求,可追溯到 2004 年,但从未实施过。 https://bugs.mysql.com/bug.php?id=4919

解决方法是使用 table-level 外键约束语法,即使您的情况允许 column-level 约束,因为它仅适用于单个列。

create table Score ( 
 rollno int, 
 marks int,
 foreign key(rollno) references student(rollno) 
);

缺少此功能的原因可能令人不满意,但来自 InnoDB 的架构师:

MySQL does not give a syntax error, because it was the intention in the 1990's that table definitions containing FOREIGN KEY constraints should be importable to MySQL, even though MySQL at that time did not support foreign keys.

对于其他根本不支持外键的存储引擎(例如MyISAM),也有接受但忽略外键语法的情况。没有返回错误或警告,但没有保存外键约束。