什么是MySQL外键?

什么是MySQL外键?,mysql,Mysql,在关于堆栈溢出的回答中,我看到了以下代码: CREATE TABLE Favorites ( user_id INT NOT NULL, movie_id INT NOT NULL, PRIMARY KEY (user_id, movie_id), FOREIGN KEY (user_id) REFERENCES Users(user_id), FOREIGN KEY (movie_id) REFERENCES Movies(movie_id) ); 我

在关于堆栈溢出的回答中,我看到了以下代码:

CREATE TABLE Favorites (
    user_id INT NOT NULL,
    movie_id INT NOT NULL,
    PRIMARY KEY (user_id, movie_id),
    FOREIGN KEY (user_id) REFERENCES Users(user_id),
    FOREIGN KEY (movie_id) REFERENCES Movies(movie_id)
);
我以前从未使用过“外键”关系关键字

  • 这是什么
  • 人们为什么使用它
  • 除了语义之外,它还有什么好处吗

外键是对另一个表或表本身中主键的引用。它被用来做所谓的事情。基本上在您提供的表中,要将记录插入到
收藏夹
,您必须从
用户
表中提供有效的
用户id
,从
电影
表中提供有效的
电影id
。由于强制使用外键,我无法从
用户
电影
中删除记录。如果我没有外键,我可以删除那些记录。然后如果我做了一个
选择。。。加入
收藏夹上的
它将中断


请参阅。

外键描述两个表之间的关系。它有很多好处:

  • 您可以强制执行,如果一个值在一个表中,那么它也必须存在于另一个表中。任何试图打破此约束的行为都将导致错误
  • 它允许数据库管理员或程序员通过查看表定义更容易地理解表之间的关系
  • 它允许工具检查模式并绘制图表,显示表之间的关系,或者创建类,在这些类中,对象的子对象可以通过成员从父对象访问
  • 在InnoDB中,添加外键也会自动在该列上添加索引,以便在任意方向有效地进行连接。()

如果您使用的是MyISAM,则不支持外键。

您还可以添加在删除相关记录时级联的功能。例如,如果我有一个library表,其中包含相关“book”表中的许多书籍,并且我从我的library表中删除了一个给定的库,那么它的相关书籍记录也将被删除

为什么要用它?我有多个具有多对多关系的表,我在没有明确定义这些关系的情况下工作得“很好”。基本上它有助于保持数据的干净。所以。。。这基本上迫使MySQL检查ID是否存在,并抛出一个错误,如果记录不存在,则无法插入该记录?这取决于实现。“与该用户相关的所有记录都会自动删除吗?”如果您使用DELETE CASCADE上的
外键请求,则可以。无论哪种方式,确保没有对现在已删除的行的“悬空引用”都是至关重要的,否则您的应用程序可能会表现得异常和不一致。虽然您可能认为您的应用程序将永远不会删除其中一个而不删除另一个,但在实践中,很容易留下一个死角或一个临时测试,这会在将来造成难以调试的奇怪