mysql支持外键吗

52次阅读
没有评论

共计 3893 个字符,预计需要花费 10 分钟才能阅读完成。

本篇内容主要讲解“mysql 支持外键吗”,感兴趣的朋友不妨来看看。本文介绍的方法操作简单快捷,实用性强。下面就让丸趣 TV 小编来带大家学习“mysql 支持外键吗”吧!

mysql 支持外键。在 MySQL 中,外键主要用来建立主表与从表的关联关系,可以为两个表的数据建立连接,约束两个表中数据的一致性和完整性;当主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值;且外键中列的数目和对应数据类型必须和主表的主键中的相同。

本教程操作环境:windows7 系统、mysql8 版本、Dell G3 电脑。

mysql 支持外键。

MySQL 外键(FOREIGN KEY)

外键是指定表中与另一个表的另一个字段匹配的字段。外键对相关表中的数据设置了约束,这使 MySQL 能够保持参照完整性。

外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性。

对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。

主表删除某条记录时,从表中与之对应的记录也必须有相应的改变。一个表可以有一个或多个外键,外键可以为空值,若不为空值,则每一个外键的值必须等于主表中主键的某个值。

我们来看看示例数据库中的以下数据库图。

我们有两个表:customers 和 orders,每个客户都有零个或多个订单,每个订单只能属于一个客户。customers 表和 orders 表之间的关系是一对多的,它 orders 由 customerNumber 字段指定的表中的外键建立。customers 表中的 customerNumber 字段与 orders 表中的 customerNumber 主键字段相关。

customers 表称为父表或引用表,orders 表称为子表或引用表。

外键可以是一个列或一组列。子表中的列通常引用父表中的主键列。

表可以具有多个外键,子表中的每个外键可以引用不同的父表。

子表中的行必须包含父表中存在的值,例如,orders 表中的每个订单记录必须具有 customers 表 customerNumber 中存在的值。因此,多个订单可以引用同一个客户,这种关系称为一个(客户)到多个(订单)或一对多。

有时,子表和父表是相同的。外键引用表的主键,例如,下 employees 表:

reportTo 列是一个外键,它引用 employeeNumber 作为 employees 表的主键的列,以反映员工之间的汇报结构,即每个员工向另一个员工汇报,员工可以有零个或多个直接汇报。我们有一个关于自联接教程可以帮助您根据这种表查询数据。

reportTo 外键也被称为递归或自引用的外键。

外键强制执行引用完整性,可帮助您自动维护数据的一致性和完整性。例如,您无法为不存在的客户创建订单。

此外,您可以 customerNumber 在外键的删除操作上设置级联,以便在删除 customers 表中的客户时,也会删除与客户关联的所有订单。这节省了使用多个 DELETE 语句 或 DELETE JOIN 语句的时间和精力。

与删除相同,您还可以在更新操作上为 customerNumber 外键定义级联,以便在不使用多个 UPDATE 语句或 UPDATE JOIN 语句的情况下执行跨表更新。

注意:在 MySQL 中,InnoDB 存储引擎支持外键,因此您必须创建 InnoDB 表才能使用外键约束。

mysql 定义外键时,需要遵守下列规则:

主表必须已经存在于数据库中,或者是当前正在创建的表。如果是后一种情况,则主表与从表是同一个表,这样的表称为自参照表,这种结构称为自参照完整性。

必须为主表定义主键。

主键不能包含空值,但允许在外键中出现空值。也就是说,只要外键的每个非空值出现在指定的主键中,这个外键的内容就是正确的。

在主表的表名后面指定列名或列名的组合。这个列或列的组合必须是主表的主键或候选键。

外键中列的数目必须和主表的主键中列的数目相同。

外键中列的数据类型必须和主表主键中对应列的数据类型相同。

为表创建外键

MySQL 创建外键语法

以下语法说明如何在 CREATE TABLE 语句中的子表中定义外键。

CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name (columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action

让我们更详细地学习一下语法:

CONSTRAINT 子句允许您为外键约束定义约束名称。如果省略它,MySQL 将自动生成一个名称。

FOREIGN KEY 子句指定子表中引用父表中主键列的列。你可以把一个外键名称放在 FOREIGN KEY 子句之后,或者让 MySQL 为你创建一个名字。请注意,MySQL 会自动使用 foreign_key_name 名称创建索引。

REFERENCES 子句指定子表中的列所引用的父表及列。在规定的子表和父表的列数 FOREIGN KEY 和 REFERENCES 必须相同。

ON DELETE 子句允许您定义删除父表中的记录时子表中记录的内容。如果省略 ON DELETE 子句并删除父表中包含子表中记录的记录,MySQL 将拒绝删除。此外,MySQL 还为您提供操作,以便您可以使用其他选项,例如 ON DELETE CASCADE  ,要求 MySQL 删除子表中的记录,当父表中的记录被删除时,记录将引用父表中的记录。如果您不希望删除子表中的相关记录,请改用 ON DELETE SET NULL 操作。MySQL 会将子表中的外键列值设置为 NULL 删除父表中的记录时,条件是子表中的外键列必须接受 NULL 值。请注意,如果您使用 ON DELETE NO ACTION 或 ON DELETE RESTRICT 操作,MySQL 将拒绝删除。

ON UPDATE 子句使您可以指定更新父表中的行时子表中的行会发生什么。您可以省略 ON UPDATE 子句,以便在更新父表中的行时让 MySQL 拒绝对子表中行的任何更新。ON UPDATE CASCADE 操作允许您执行跨表更新,并且当更新父表 ON UPDATE SET NULL 中的行时,操作会将子表中的行中的值重置为值 NULL。ON UPDATE NO ACTION 或 UPDATE RESTRICT 行动拒绝任何更新。

MySQL 创建表外键示例

下面的示例创建一个 dbdemo 数据库和两个表:categories 和  products. 每个类别具有一个或多个产品和每个产品只属于一个类别。products 表中的 cat_id 字段被定义为带有 UPDATE ON CASCADE 和 DELETE ON RESTRICT 操作的外键。

CREATE DATABASE IF NOT EXISTS dbdemo;
 
USE dbdemo;
 
CREATE TABLE categories(
 cat_id int not null auto_increment primary key,
 cat_name varchar(255) not null,
 cat_description text
) ENGINE=InnoDB;
 
CREATE TABLE products(
 prd_id int not null auto_increment primary key,
 prd_name varchar(355) not null,
 prd_price decimal,
 cat_id int not null,
 FOREIGN KEY fk_cat(cat_id)
 REFERENCES categories(cat_id)
 ON UPDATE CASCADE
 ON DELETE RESTRICT
)ENGINE=InnoDB;

将外键添加到表中

MySQL 添加外键语法

要将外键添加到现有表,请使用带有上述外键定义语法的 ALTER TABLE 语句:

ALTER TABLE table_name
ADD CONSTRAINT constraint_name
FOREIGN KEY foreign_key_name(columns)
REFERENCES parent_table(columns)
ON DELETE action
ON UPDATE action;

MySQL 添加外键示例

现在,让我们添加一个名为 vendors 的新表,并更改 products 表以包含供应商 ID 字段:

USE dbdemo;
 
CREATE TABLE vendors(
 vdr_id int not null auto_increment primary key,
 vdr_name varchar(255)
)ENGINE=InnoDB;
 
ALTER TABLE products 
ADD COLUMN vdr_id int not null AFTER cat_id;

要向表中添加外键 products,请使用以下语句:

ALTER TABLE products
ADD FOREIGN KEY fk_vendor(vdr_id)
REFERENCES vendors(vdr_id)
ON DELETE NO ACTION
ON UPDATE CASCADE;

现在,products 表有两个外键,一个引用 categories 表,另一个引用 vendors 表。

到此,相信大家对“mysql 支持外键吗”有了更深的了解,不妨来实际操作一番吧!这里是丸趣 TV 网站,更多相关内容可以进入相关频道进行查询,关注我们,继续学习!

正文完
 
丸趣
版权声明:本站原创文章,由 丸趣 2023-07-13发表,共计3893字。
转载说明:除特殊说明外本站除技术相关以外文章皆由网络搜集发布,转载请注明出处。
评论(没有评论)