MySQL引用完整性约束

news/2024/7/9 11:47:36

一、定义

  • 引用完整性是对实体之间关系的描述,是定义外关键字与主关键字之间的引用规则,也就是外键约束。如果要删除被引用的对象,也要删除引用它的所有对象,或把引用值设置为空。外键指引用另一个表中的一列或多列,被引用的列应该具有主键约束或者唯一约束。外键用于加强两个表,数据之间的连接。

1.添加外键约束

语法格式

alter table 表名 add foreign key (外键字段名) references 主表表名(主键字段名);

示例

将具有唯一性约束字段age的stu表作为主表,将student表作为从表,为student表age字段添加外键约束

mysql> desc stu;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int         | YES  | UNI | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

添加外键约束

mysql> alter table student add foreign key(age) references stu(age);
Query OK, 0 rows affected (0.05 sec)
Records: 0  Duplicates: 0  Warnings: 0

查看student表具体信息,如下,外键约束添加成功,‘student_ibfk_1’为外键约束名

mysql> show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL,
  KEY `age` (`age`),
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`age`) REFERENCES `stu` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

创建表时添加外键约束

首先创建一个含有主键的表student2

mysql>  create table student2(
    -> stu_id int primary key,
    -> stu_name varchar(50)
    -> );

创建表student3时添加外键约束

mysql>  create table student3(
    -> id int,
    -> name varchar(50),
    -> stu_id int,
    -> foreign key(stu_id) references student2(stu_id)
    -> );
Query OK, 0 rows affected (0.03 sec)

查看表的具体信息,如下,外键约束创建成功

mysql> show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL,
  KEY `age` (`age`),
  CONSTRAINT `student_ibfk_1` FOREIGN KEY (`age`) REFERENCES `stu` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

2.删除外键约束

即解除两个表之间的关联关系。

alter table 表名 drop foreign key 外键名;

示例,删除student表外键约束

mysql> alter table student drop foreign key student_ibfk_1;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

如上,外键约束删除成功

mysql>  show create table student\G
*************************** 1. row ***************************
       Table: student
Create Table: CREATE TABLE `student` (
  `id` int DEFAULT NULL,
  `name` varchar(50) DEFAULT NULL,
  `age` int DEFAULT NULL,
  KEY `age` (`age`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci
1 row in set (0.00 sec)

但是主键还没有彻底删除!

采用desc语句看一下表结构,可以看到age字段的key值仍然有值

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int         | YES  | MUL | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

这是因为MySQL在创建外键后会自动建一个同名的索引。
因此,采用上面语句只能删除外键约束,无法彻底删除外键。
所以,我们需要将同名索引也删除,才可以将外键彻底删除

首先,我们需要使用show index from语句查看索引,如下。

mysql> show index from student;
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| Table   | Non_unique | Key_name | Seq_in_index | Column_name | Collation | Cardinality | Sub_part | Packed | Null | Index_type | Comment | Index_comment | Visible | Expression |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
| student |          1 | age      |            1 | age         | A         |           0 |     NULL |   NULL | YES  | BTREE      |         |               | YES     | NULL       |
+---------+------------+----------+--------------+-------------+-----------+-------------+----------+--------+------+------------+---------+---------------+---------+------------+
1 row in set (0.01 sec)

我们再使用删除索引的语句将索引删除

mysql> alter table student drop index age;
Query OK, 0 rows affected (0.01 sec)
Records: 0  Duplicates: 0  Warnings: 0

再次使用desc语句查看表结构,key列里的MUl消失了

mysql> desc student;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int         | YES  |     | NULL    |       |
| name  | varchar(50) | YES  |     | NULL    |       |
| age   | int         | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
3 rows in set (0.00 sec)

这样主键就彻底删除了!


http://www.niftyadmin.cn/n/4557412.html

相关文章

noip允许使用什么头文件

流 相关的头文件&#xff1a;<bitset><iterator><string><iostream> 2.禁止使用的部分 序列&#xff1a;vector stdio.h ||| 到底是C 还是C 呀 你列的中: stdlib.h 是 C 的 串 迭代器 priority_queue ... 答案补充 C语言的stdio.h能用不过我建议你用C …

bzoj 1001 [BeiJing2006]狼抓兔子 最小割+最短路

题面 题目传送门 解法 将最大流转化成最小割&#xff0c;然后跑最短路即可 具体如何见图可以参考下图 尽量用dijkstra 代码 #include <bits/stdc.h> #define PI pair <int, int> #define mp make_pair #define N 1010 using namespace std; template <typename …

自定义tomcat实现

一、tomcat基础 1.基础功能 提供Socket服务&#xff1a;实现对某些端口的监听&#xff0c;从而实现请求到来时&#xff0c;Tomcat可以感知到。同时该Socket服务也需要支持HTTP协议。封装请求和响应&#xff1a;通过之前的介绍&#xff0c;我们知道在我们开发Servlet时&#x…

C语言中关于取三位数的各各位数的单个数字问题

在BCB下 19 了 ||| 367除以100 3367除以10取10余6367取10余7 3 18 2 1)就是6 a[j]); }} ||| 位置是固定的 只需要判断/0的位置就可以 ||| #include <stdio.h>main(){ int a[3]; int i 0; int j; int numb 123; while(numb char a[10];scanf("%s" 如果你输入的…

python标准库模块,json

展示了如何使用json模块进行编码和解码操作的常规示例&#xff1a; Python标准库模块——json&#xff08;编码解码json格式&#xff09; json模块简介 json模块是Python中的一个编码和解码JSON格式的轻量级模块&#xff0c;主要用于将Python对象编码为JSON格式输出或存储&a…

用户登录小项目

一、项目流程 登陆小项目流程 1.使用原生的方式生成页面 2.客户端先发送请求&#xff0c;得到登陆的页面 3.用户填写相应的用户数据&#xff0c;发送请求给服务端 4.服务端接收到请求后进行逻辑处理 5.服务端将处理之后的结果返回客户端 二、代码分层 M&#xff1a;模型 V&a…

B/S架构的程序与C/S架构的程序各有什么优缺点

但是数据共享不好BS与上面想相反CS可以在网上共享数据 CS安全性高

关于Js(五)------ js的基本类型有哪些?引用类型有哪些?null和undefined的区别。...

基本类型&#xff1a;Number,String,Boolean,Null,undefined。 引用类型&#xff1a;Object,Array,Date,RegExp,Function Object本质上是由一组无序的名值对组成的。 ECMAScript中用var关键字来定义变量&#xff0c;因为js是弱类型的&#xff0c;所以无法确定变量一定会存储什么…