mysql中的外键有什么用

54次阅读
没有评论

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

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

在 mysql 中,外键是用于建立和加强两个表数据之间的链接的一列或多列,它表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使 MySQL 能够保持参照完整性。

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

外键是相对主键而来的。

主键(primary key) 能够唯一标识表中某一行的属性或属性组。一个表只能有一个主键,但可以有多个候选索引。主键常常与外键构成参照完整性约束,防止出现数据不一致。主键可以保证记录的唯一和主键域非空, 数据库管理系统对于主键自动生成唯一索引,所以主键也是一个特殊的索引。

外键(foreign key)是用于建立和加强两个表数据之间的链接的一列或多列。外键表示一个表中的一个字段被另一个表中的一个字段引用。外键对相关表中的数据造成了限制,使 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_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 外键

您还可以使用 ALTER TABLE 语句将外键删除,如下语句:

ALTER TABLE table_name 
DROP FOREIGN KEY constraint_name;

在上面的声明中:

首先,指定要从中删除外键的表名称。

其次,将约束名称放在 DROP FOREIGN KEY 子句之后。

请注意,constraint_name 是在创建或添加外键到表时指定的约束的名称。如果省略它,MySQL 会为您生成约束名称。

要获取生成的表的约束名称,请使用 SHOW CREATE TABLE 语句,如下所示:

SHOW CREATE TABLE table_name;

例如,要查看 products 表的外键,请使用以下语句:

SHOW CREATE TABLE products;

以下是语句的输出:

CREATE TABLE products ( prd_id int(11) NOT NULL AUTO_INCREMENT,
 prd_name varchar(355) NOT NULL,
 prd_price decimal(10,0) DEFAULT NULL,
 cat_id int(11) NOT NULL,
 vdr_id int(11) NOT NULL,
 PRIMARY KEY (prd_id),
 KEY fk_cat (cat_id),
 KEY fk_vendor(vdr_id),
 CONSTRAINT products_ibfk_2 
 FOREIGN KEY (vdr_id) 
 REFERENCES vendors (vdr_id) 
 ON DELETE NO ACTION 
 ON UPDATE CASCADE,
 CONSTRAINT products_ibfk_1 
 FOREIGN KEY (cat_id) 
 REFERENCES categories (cat_id) 
 ON UPDATE CASCADE
) ENGINE=InnoDB;

products 表有两个外键约束:products_ibfk_1 和 products_ibfk_2。

可以使用以下语句删除 products 表的外键:

ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_1;
ALTER TABLE products 
DROP FOREIGN KEY products_ibfk_2;

MySQL 禁用外键检查

有时,因为某种原因需要禁用外键检查 (例如将 CSV 文件中的数据导入表中) 非常有用。如果不禁用外键检查,则必须以正确的顺序加载数据,即必须首先将数据加载到父表中,然后再将数据加载导入到子表中,这可能是乏味的。但是,如果禁用外键检查,则可以按任何顺序加载导入数据。

除非禁用外键检查,否则不能删除由外键约束引用的表。删除表时,还会删除为表定义的任何约束。

要禁用外键检查,请使用以下语句:

SET foreign_key_checks = 0;

当然,可以使用以下语句启用它:

SET foreign_key_checks = 1;

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

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