MySQL数据库外键 foreing key

目录
  • 1、外键操作
    • 1.1、增加外键
    • 1.2、删除外键
    • 1.3、外键的基本要求
  • 2、外键约束
    • 2.1、约束的基本概念
    • 2.2、外键约束的概念
    • 2.3、约束的作用

前言:

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

外键 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内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • Mysql关于数据库是否应该使用外键约束详解说明

    一.前言 对于[是否使用外键约束]这个话题已经是老生常谈的了.在学校中,老师交给我们的大多是需要我们建立外键约束,但进入了实际工作很多时候并不会使用外键,而是通过代码逻辑来控制.包括在阿里的JAVA规范中也明确规定:[强制]不得使用外键与级联,一切外键概念必须在应用层解决. 为什么要做这样的规定呢?到底该不该使用外键约束呢?我们可以举一个例子来说明 二.举例说明 现在我们在数据库中建立了两张表:[product和project],[project]的porduct字段,关联Product,他们之

  • Mysql外键约束的创建与删除的使用

    目录 创建表时创建外键 给存在的表添加外键 删除外键约束 创建表时创建外键 创建两个表格, 一个名为class, create table classes( id int not null primary key, name varchar(30) ); 另一个名为student create table student( sid int not null primary key, sname varchar(30), cid int not null, constraint fk_cid fo

  • 新手必学的mysql外键设置方式

    目录 外键的作用 mysql外键设置方式 总结 外键的作用 保持数据一致性,完整性,主要目的是控制存储在外键表中的数据. 使两张表形成关联,外键只能引用外表中的列的值! 例如: a b 两个表 a表中存有 客户号,客户名称 b表中存有 每个客户的订单 有了外键后 你只能在确信b 表中没有客户x的订单后,才可以在a表中删除客户x 建立外键的前提: 本表的列必须与外键类型相同(外键必须是外表主键). 指定主键关键字: foreign key(列名) 引用外键关键字: references <外键表名

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

    引子:把所有数据都存放于一张表的弊端 表的组织结构复杂不清晰 浪费空间 扩展性极差 为了解决上述的问题,就需要用多张表来存放数据. 表与表的记录之间存在着三种关系:一对多.多对多.一对一的关系. 处理表之间关系问题就会利用到FOREIGN KEY 多对一关系: 寻找表与表之间的关系的套路 举例:雇员表:emp表   部门:dep表 part1: 先站在表emp的角度 去找表emp的多条记录能否对应表dep的一条记录. 翻译2的意义: 左表emp的多条记录==>多个员工 右表dep的一条记录==>

  • 简述MySQL主键和外键使用及说明

    目录 一.外键约束 什么是外键: 外键的使用条件: 外键的定义语法: 简单演示使用 一.外键约束 MySQL通过外键约束来保证表与表之间的数据的完整性和准确性. 什么是外键: 主键:是唯一标识一条记录,不能有重复的,不允许为空,用来保证数据完整性 外键:是另一表的主键, 外键可以有重复的, 可以是空值,用来和其他表建立联系用的.所以说,如果谈到了外键,一定是至少涉及到两张表.例如下面这两张表: 外键的使用条件: 1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支

  • mysql增加外键约束具体方法

    本教程操作环境:windows7系统.mysql8版本.Dell G3电脑. MySQL 外键约束(FOREIGN KEY)是表的一个特殊字段,经常与主键约束一起使用.对于两个具有关联关系的表而言,相关联字段中主键所在的表就是主表(父表),外键所在的表就是从表(子表). 外键用来建立主表与从表的关联关系,为两个表的数据建立连接,约束两个表中数据的一致性和完整性. 定义外键时,需要遵守下列规则: 主表必须已经存在于数据库中,或者是当前正在创建的表.如果是后一种情况,则主表与从表是同一个表,这样的表

  • MySQL数据库外键 foreing key

    目录 1.外键操作 1.1.增加外键 1.2.删除外键 1.3.外键的基本要求 2.外键约束 2.1.约束的基本概念 2.2.外键约束的概念 2.3.约束的作用 前言: 外键表示了两个实体之间的联系 外键 foreing key: A表中的一个字段的值指向另B表的主键 B: 主表 A: 从表 主表:主键(主关键字) = 从表:外键(外关键字) 1.外键操作 1.1.增加外键 基本语法: 方式一:创建表的时候增加外键 [constraint `外键名`] foreign key (外键字段) re

  • mysql制作外键出现duplicate key name错误问题及解决

    目录 mysql制作外键出现duplicate key name错误 mysql建表出现错误 总结 mysql制作外键出现duplicate key name错误 在borrowlist表中bookid(int,not null)参考books表中id(int ,pk ,not null)属性,但是出现duplicate key name’FK_borrowlist’ error number:1061问题,请问该如何解决? 应该是你那个外键索引名有重复了把FK_borrowlist改成FK_b

  • MySQL删除外键问题小结

    MySQL:MySQL不能删除外键,抱错Error on rename of ./ruler/test2child to ./ruler/#sql2-298-92 (errno: 152) 曾经这是MySQL的一个bug,但是现在只是MySQL的一个不友好的地方. 例子如下: mysql> ALTER TABLE ruler.test2child DROP FOREIGN KEY test; ERROR 1025 : Error on rename of ''./ruler/test2child

  • MySQL使用外键实现级联删除与更新的方法

    本文实例讲述了MySQL使用外键实现级联删除与更新的方法.分享给大家供大家参考,具体如下: MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定在删除.更新父表时,对子表进行的相应操作,包括RESTRICT.NO ACTION.SET NULL和CASCADE.其中RESTRICT和NO ACTION相同,是指在子表有关联记录的情况下父表不能更新:CASCADE表示父表在更新或者删除时,更

  • Mysql添加外键的两种方式详解

    目录 Mysql添加外键的几种方式 方法一: 方法二: 补充:MySQL 删除外键操作 总结 Mysql添加外键的几种方式 注意:添加外键是给从表添加(即子表)父表是主表 方法一: 创建表之前: FOREIGN KEY (子表id) REFERENCES 关联表名(外主表id) 例如 create table emp( e_id int auto_increment primary key, ename varchar(50) not null, age int, job varchar(20)

  • MySQL删除外键、增加外键以及删除主键、增加主键的实战步骤

    目录 一.MySQL删除外键 二.MySQL增加外键 三.MySQL删除主键 四.MySQL增加主键 补充:MySQL中有外键时数据表的删除方法 总结 一.MySQL删除外键 格式: alter table 表名 drop foreign key 外键名; 表名就是有外键存在的那个表. 外键名可以通过查看表的创建信息得到. 查看表的创建信息格式: show create table 表名; 二.MySQL增加外键 外键可以在修改表时添加,但是添加外键的前提是: 从表中外键列中的数据必须与主表中主

  • MySQL删除外键时报错Error Code:1091. Can‘t DROP ‘XXX‘的解决方法

    解决MySQL删除外键时报错Error Code: 1091. Can't DROP 'XXX'; check that column/key exists 长期不写基础的 MySQL 代码,笔者也开始犯一些低级错误.最近,笔者在尝试将表中某列的外键约束删除时,MySQL 却一直报该列本就不存在的错误. 笔者报错时的运行环境: MySQL 8.0.27 Windows 10 教育版 Error Code: 1091. Can't DROP 'XXX'; check that column/key

  • mysql外键(Foreign Key)介绍和创建外键的方法

    在MySQL中,InnoDB引擎类型的表支持了外键约束.外键的使用条件:1.两个表必须是InnoDB表,MyISAM表暂时不支持外键(据说以后的版本有可能支持,但至少目前不支持):2.外键列必须建立了索引,MySQL 4.1.2以后的版本在建立外键时会自动创建索引,但如果在较早的版本则需要显示建立:3.外键关系的两个表的列必须是数据类型相似,也就是可以相互转换类型的列,比如int和tinyint可以,而int和char则不可以: 外键的好处:可以使得两张表关联,保证数据的一致性和实现一些级联操作

随机推荐