我的编程空间,编程开发者的网络收藏夹
学习永远不晚

MySQL数据库外键 foreing key

短信预约 -IT技能 免费直播动态提醒
省份

北京

  • 北京
  • 上海
  • 天津
  • 重庆
  • 河北
  • 山东
  • 辽宁
  • 黑龙江
  • 吉林
  • 甘肃
  • 青海
  • 河南
  • 江苏
  • 湖北
  • 湖南
  • 江西
  • 浙江
  • 广东
  • 云南
  • 福建
  • 海南
  • 山西
  • 四川
  • 陕西
  • 贵州
  • 安徽
  • 广西
  • 内蒙
  • 西藏
  • 新疆
  • 宁夏
  • 兵团
手机号立即预约

请填写图片验证码后获取短信验证码

看不清楚,换张图片

免费获取短信验证码

MySQL数据库外键 foreing key

前言:

外键表示了两个实体之间的联系

外键 foreing key: A表中的一个字段的值指向另B表的主键

  • B: 主表
  • A: 从表

主表:主键(主关键字) = 从表:外键(外关键字)

1、外键操作

1.1、增加外键

基本语法:

方式一:创建表的时候增加外键

[constraint `外键名`] foreign key (外键字段) references 主表(主键);

方式二:创建表后增加外键

alter table 从表 add [constraint `外关键字`] foreign key (外键字段) references 主表(主键);

示例1: 创建表的时候增加外键

-- 创建外键
create table my_foreign(
    id int primary key auto_increment,
    name varchar(10) not null,
    class_id int,
    -- 创建时,会自动增加普通索引
    foreign key (class_id) references my_class(id)
);

mysql> show create table my_foreign;
CREATE TABLE `my_foreign` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL,
  `class_id` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `class_id` (`class_id`),
  CONSTRAINT `my_foreign_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `my_class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci


mysql> desc my_foreign;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | NO   |     | NULL    |                |
| class_id | int(11)     | YES  | MUL | NULL    |                |
+----------+-------------+------+-----+---------+----------------+
3 rows in set (0.01 sec)

MUL多索引 外键本身也是索引

示例2: 创建表后增加外键

-- 查看原来的表
mysql> desc my_class;
+-------+-------------+------+-----+---------+----------------+
| Field | Type        | Null | Key | Default | Extra          |
+-------+-------------+------+-----+---------+----------------+
| id    | int(11)     | NO   | PRI | NULL    | auto_increment |
| name  | varchar(10) | NO   | UNI | NULL    |                |
+-------+-------------+------+-----+---------+----------------+
2 rows in set (0.01 sec)

mysql> show create table my_class;
CREATE TABLE `my_class` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci NOT NULL,
  PRIMARY KEY (`id`),
  UNIQUE KEY `name` (`name`)
) ENGINE=InnoDB AUTO_INCREMENT=4 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci


mysql> desc my_student;
+----------+-------------+------+-----+---------+----------------+
| Field    | Type        | Null | Key | Default | Extra          |
+----------+-------------+------+-----+---------+----------------+
| id       | int(11)     | NO   | PRI | NULL    | auto_increment |
| name     | varchar(10) | YES  |     | NULL    |                |
| class_id | int(11)     | YES  |     | NULL    |                |
| age      | int(11)     | YES  |     | NULL    |                |
| gender   | int(11)     | YES  |     | NULL    |                |
+----------+-------------+------+-----+---------+----------------+

mysql> show create table my_student\G
*************************** 1. row ***************************
       Table: my_student
Create Table: CREATE TABLE `my_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

-- 增加外键
alter table my_student add constraint fk_class_id foreign key (class_id) references my_class(id);

mysql> show create table my_student\G
*************************** 1. row ***************************
       Table: my_student
Create Table: CREATE TABLE `my_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_class_id` (`class_id`),
  CONSTRAINT `fk_class_id` FOREIGN KEY (`class_id`) REFERENCES `my_class` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

1.2、删除外键

外键不允许修改,只能先删除再添加

alter table 从表 drop foreign key 外键名字;

示例:

alter table my_student drop foreign key `fk_class_id`;
mysql> show create table my_student\G
*************************** 1. row ***************************
       Table: my_student
Create Table: CREATE TABLE `my_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `fk_class_id` (`class_id`)
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

外键不会删除普通索引,只会删除外键

删除普通索引:

alter table 表名 drop index 索引名字;

1.3、外键的基本要求

  • 外键字段需要与关联的主表的主关键字段类型完全一致
  • 基本属性也要相同
  • 如果是表后增加外键,对数据还有一定的要求(从表数据与主表的关联关系)
  • 外键只能使用innodb存储引擎,myisam不支持

2、外键约束

外键约束:通过建立外键关系后,对主表和从表都会有一定的数据约束效律

2.1、约束的基本概念

当外键产生时,外键所在的表(从表)会受制于主表数据的存在,从而导致数据不能进行某些不符合规范的操作
不能插入主表不存在的数据

如果一张表被其他表外键引入,那么该表的数据操作不能随意,必须保证从表数据的有效性,不能随意删除一个被从表引入的记录

mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
|  2 | 二班   |
+----+--------+

insert into my_foreign (name, class_id) values ('张飞', 1);
Query OK, 1 row affected (0.01 sec)

-- 主表没有id=4的记录,从表不能插入该数据
insert into my_foreign (name, class_id) values ('张飞', 4);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint fails (`mydatabase`.`my_foreign`, CONSTRAINT `my_foreign_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `my_class` (`id`))

mysql> select * from my_foreign;
+----+--------+----------+
| id | name   | class_id |
+----+--------+----------+
|  1 | 张飞   |        1 |
+----+--------+----------+
1 row in set (0.00 sec)

-- 从表中引用了id=1的记录,该数据不能被删除
delete from my_class where id = 1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`mydatabase`.`my_foreign`, CONSTRAINT `my_foreign_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `my_class` (`id`))

2.2、外键约束的概念

基本语法:

add foreign key (外键字段) references 主表(主键) on 约束模式;

约束模式有三种:

  • district 严格模式 默认,不允许操作
  • cascade 级联模式,一起操作,主表变化,从表的数据也跟着变化
  • set null 置空模式 主表变化(删除),从表对应记录设置,前提是从表中对应的外键字段允许为空

外键约束的主要对象是主表操作,从表就是不能插入主表不存在的数据

通常在进行约束的时候,需要制定操作,update 和 delete

常用的模式:

-- 更新级联, 删除置空, 空格隔开
on update cascade on delete set null;
-- 增加约束模式
alter table my_student
add foreign key (class_id) references my_class(id)
on update cascade on delete set null;
mysql> show create table my_student\G
*************************** 1. row ***************************
       Table: my_student
Create Table: CREATE TABLE `my_student` (
  `id` int(11) NOT NULL AUTO_INCREMENT,
  `name` varchar(10) COLLATE utf8mb4_general_ci DEFAULT NULL,
  `class_id` int(11) DEFAULT NULL,
  `age` int(11) DEFAULT NULL,
  `gender` int(11) DEFAULT NULL,
  PRIMARY KEY (`id`),
  KEY `class_id` (`class_id`),
  CONSTRAINT `my_student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `my_class` (`id`) ON DELETE SET NULL ON UPDATE CASCADE
) ENGINE=InnoDB AUTO_INCREMENT=10 DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_general_ci

mysql> select * from my_class;
+----+--------+
| id | name   |
+----+--------+
|  1 | 一班   |
|  3 | 三班   |
|  2 | 二班   |
+----+--------+
3 rows in set (0.00 sec)

mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 刘备   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        2 |   20 |      2 |
|  4 | 张飞   |        2 |   21 |      1 |
|  5 | 关羽   |     NULL |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+
6 rows in set (0.00 sec)

-- 更新主表
update my_class set id = 4 where id = 2;

-- 从表中所有class_id=2 的记录被修改为了 class_id=4
mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 刘备   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |        4 |   20 |      2 |
|  4 | 张飞   |        4 |   21 |      1 |
|  5 | 关羽   |     NULL |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+

-- 删除主表数据
delete from  my_class where id = 4;

-- 从表中记录class_id=4被修改为class_id=null;
mysql> select * from my_student;
+----+--------+----------+------+--------+
| id | name   | class_id | age  | gender |
+----+--------+----------+------+--------+
|  1 | 刘备   |        1 |   18 |      2 |
|  2 | 李四   |        1 |   19 |      1 |
|  3 | 王五   |     NULL |   20 |      2 |
|  4 | 张飞   |     NULL |   21 |      1 |
|  5 | 关羽   |     NULL |   22 |      2 |
|  6 | 曹操   |        1 |   20 |   NULL |
+----+--------+----------+------+--------+
6 rows in set (0.00 sec)

2.3、约束的作用

保证数据的完整性,主表与从表的数据要一致,正是因为外键有非常强大的数据约束作用,而且可能导致数据再后台变化的不可控性,导致程序在设计开发逻辑的时候,没有办法很好的把握数据,所以外键很少使用

到此这篇关于MySQL数据库外键 foreing key的文章就介绍到这了,更多相关MySQL foreing key内容请搜索编程网以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程网!

免责声明:

① 本站未注明“稿件来源”的信息均来自网络整理。其文字、图片和音视频稿件的所属权归原作者所有。本站收集整理出于非商业性的教育和科研之目的,并不意味着本站赞同其观点或证实其内容的真实性。仅作为临时的测试数据,供内部测试之用。本站并未授权任何人以任何方式主动获取本站任何信息。

② 本站未注明“稿件来源”的临时测试数据将在测试完成后最终做删除处理。有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341

MySQL数据库外键 foreing key

下载Word文档到电脑,方便收藏和打印~

下载Word文档

猜你喜欢

MySQL中的外键(foreign key)

阅读目录 前言一、外键作用及其限制条件1 外键的定义2 外键的作用3 外键创建限制 二、外键创建方法1 创建外键的语法2 举例(1)创建两张表(2)创建外键(3)查看表结构 三、验证外键作用1 先向主表中添加数据
2023-08-25

mysql数据库外键怎么设置

外键在 mysql 中用于在表之间建立关系约束,确保引用数据的完整性。步骤包括:1. 创建外键,指定外键列和所引用的父表和父键;2. 指定约束类型(限制、级联、置空)。设置外键可以维护数据完整性,防止引用不存在的记录,简化数据操纵。如何在
mysql数据库外键怎么设置
2024-08-05

MySQL数据库中的外键约束详解

外键是关系数据库中一种重要的数据完整性约束,它用于建立表与表之间的关联关系。外键约束指定了一个表的列或一组列必须存在于另一个表的主键或唯一键中。在MySQL中,外键约束使用FOREIGN KEY关键字来定义。以下是外键约束的详细解释:1.
2023-09-22

数据库添加外键错误:[Err] 1215 - Cannot add foreign key constraint 的解决

今天给mysql数据库中的表添加外键,保存时出现错误:[Err] 1215 - Cannot add foreign key constraint,导致无法添加外键。外键定义添加的条件:(1)外键对应的字段数据类型保持一致(2)所有tables必须是InnoD
数据库添加外键错误:[Err] 1215 - Cannot add foreign key constraint 的解决
2022-01-08

mysql数据库实现超键、候选键、主键与外键的使用

目录1、超键(Superkey)2、候选键(Candidate Key)3、主键(Primary Key)4、外键(Foreign Key)1、超键(Superkey)超键是能唯一确定表中每行数据的属性集。它可以是单个属性或多个属性的组合
mysql数据库实现超键、候选键、主键与外键的使用
2024-09-30

MySQL数据库中外键的定义和限制

标题:MySQL数据库中外键的定义和限制在MySQL数据库中,外键是一种用于建立表与表之间关系的约束。外键可以确保在一个表中的数据与另一个表中的数据具有一定的关联性。通过定义外键,我们可以实现数据之间的参照完整性,从而保证数据的一致性和可
MySQL数据库中外键的定义和限制
2024-03-15

MySQL外键约束(FOREIGN KEY)案例讲解

MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用。对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表)。 外键用来建立主表与从表的关联关系,为两个表的数
2022-05-27

MySQL 外键(FOREIGN KEY)用法案例详解

引子:把所有数据都存放于一张表的弊端表的组织结构复杂不清晰浪费空间扩展性极差为了解决上述的问题,就需要用多张表来存放数据。 表与表的记录之间存在着三种关系:一对多、多对多、一对一的关系。 处理表之间关系问题就会利用到FOREIGN KEY
2022-05-18

MySQL外键约束(Foreign Key)案例详解

目录一、mysql外键约束作用二、外键约束创建(一)创建外键约束的条件(二)在创建数据表时创建外键约束(三)在创建数据表后添加外键约束三、外键约束功能演示总结今天继www.cppcns.com续给大家介绍MySQL相关知识,本文主要内容是M
2022-06-28

数据库navicat怎么定义外键

在 navicat 中定义外键可确保数据完整性,操作步骤如下:编辑列,勾选 "外键"。选择父表和父列。设置更新和删除规则,如级联更新、禁止等。保存更改。Navicat 中定义外键的方法在 Navicat 中定义外键可以确保数据库表之间的数
数据库navicat怎么定义外键
2024-04-23

sql数据库如何设置外键

在 SQL 数据库中,可以使用以下步骤来设置外键:1. 创建主表和从表。主表包含要作为主键的列,从表包含要作为外键的列。```CREATE TABLE 表名 ( 列名 数据类型 PRIMARY KEY, ...);```2. 在从表中添
2023-10-12

sql数据库怎么设置外键

sql 中外键是一种数据库约束,确保子表记录与主表相关记录关联。要设置外键,需要:1. 确定主表和子表;2. 选择相应列作为父列和子列;3. 使用 alter table 语句创建外键约束,指定子列、主表、父列以及附加选项(如果需要)。例如
sql数据库怎么设置外键
2024-05-30

MySQL数据库中外键的作用及用法详解

MySQL数据库中外键的作用及用法详解在MySQL数据库中,外键是用来建立表与表之间关联的重要工具,它能够确保数据完整性,并且提供了一种方式来维护表与表之间的关系。本文将详细介绍MySQL数据库中外键的作用和用法,并提供具体的代码示例。
MySQL数据库中外键的作用及用法详解
2024-03-15

编程热搜

目录