MySQL7种约束还不懂? 万字整理MySQL约束,哪里不会点哪里,还不赶紧上车?(二)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
云数据库 RDS MySQL,高可用系列 2核4GB
简介: MySQL7种约束还不懂? 万字整理MySQL约束,哪里不会点哪里,还不赶紧上车?(二)

❤三、PRIMARY KEY 约束

1、作用

用来唯一标识表中的一行记录。


2、特点

主键约束相当于唯一约束+非空约束的组合,主键约束列不允许重复,也不允许出现空值`


一个表最多只能有一个主键约束,建立主键约束可以在列级别创建,也可以在表级别上创建


主键约束对应着表中的一列或者多列(复合主键)


如果是多列组合的复合主键约束,那么这些列都不允许为空值,并且组合的值不允许重复


MySQL的主键名总是PRIMARY,就算自己命名了主键约束名也没用


当创建主键约束时,系统默认会在所在的列或列组合上建立对应的主键索引(能够根据主键查询的,就根据主键查询,效率更高)。如果删除主键约束了,主键约束对应的索引就自动删除了


不要修改主键字段的值,因为主键是数据记录的唯一标识,如果修改了主键的值,就有可能会破坏数据的完整性。


3、添加主键约束

(1)建表时指定主键约束


语法结构:


create table 表名称(
  字段名  数据类型  primary key, #列级模式
    字段名  数据类型  
);
create table 表名称(
  字段名  数据类型,
    字段名  数据类型,
    [constraint 约束名] primary key(字段名) #表级模式,[]内设置约束名
);


举例:


#列级约束
create table temp(
  id int primary key,
    name varchar(20)
);
insert into temp values(1,'张三');#成功
insert into temp values(1,'张三');#失败
ERROR 1062 (23000): Duplicate(重复) entry(键入,输入) '1' for key 'PRIMARY'
insert into temp values(1,'王五');#失败
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
insert into temp values(4,null);#成功
insert into temp values(null,'李琦');#失败
ERROR 1048 (23000): Column 'id' cannot be null



#表级约束
CREATE TABLE emp5(
id INT NOT NULL AUTO_INCREMENT,
NAME VARCHAR(20),
pwd VARCHAR(15),
CONSTRAINT emp5_id_pk PRIMARY KEY(id)
);


(2)建表后增加主键约束


ALTER TABLE 表名 ADD PRIMARY KEY(字段列表); #字段列表可以是一个字段,也可以是多个字段,如果是多个字段的话,是复合主键(表级约束)


ALTER TABLE student ADD PRIMARY KEY (sid);


ALTER TABLE emp5 ADD PRIMARY KEY(NAME,pwd);


4、关于复合主键

语法结构:


create table 表名称(

字段名  数据类型,
    字段名  数据类型,  
    字段名  数据类型,
    primary key(字段名1,字段名2)  #表示字段1和字段2的组合是唯一的,也可以有更多个字段
);


#学生表
create table student(
  sid int primary key,  #学号
    sname varchar(20)     #学生姓名
);
#课程表
create table course(
  cid int primary key,  #课程编号
    cname varchar(20)     #课程名称
);
#选课表
create table student_course(
  sid int,
    cid int,
    score int,
    primary key(sid,cid)  #复合主键
);
insert into student values(1,'张三'),(2,'李四');
insert into course values(1001,'Java'),(1002,'MySQL');
insert into student_course values(1, 1001, 89),(1,1002,90),(2,1001,88),(2,1002,56);



上述插入语句都成功,说明其复合主键约束跟复合唯一性约束在功能上差不多。即两个主键约束满足一个就可以


CREATE TABLE emp(
age INT ,
`name` VARCHAR(25),
id INT UNIQUE ,
#取别名,但是没有用
CONSTRAINT emp_py PRIMARY KEY(age,`name`)
);


查看结果:

image.png


5、删除主键约束

alter table 表名 drop primary key;


举例:


ALTER TABLE emp DROP PRIMARY KEY;


说明:删除主键约束,不需要指定主键名,因为一个表只有一个主键,删除主键约束后,非空还存在。


如下图: 非空依然存在



❤四、FOREIGN KEY 约束

1、作用

限定某个表的某个字段的引用完整性。


比如:员工表的员工所在部门的选择,必须在部门表能找到对应的部分。


2、主表和从表

主表:被引用的表,被参考的表


从表:引用别人的表,参考别人的表


例如:员工表的员工所在部门这个字段的值要参考部门表:部门表是主表,员工表是从表。


例如:学生表、课程表、选课表:选课表的学生和课程要分别参考学生表和课程表,学生表和课程表是主表,选课表是从表。


3、特点(没事看看)

从表的外键列,必须引用/参考主表的主键或唯一约束的列

在创建外键约束时,如果不给外键约束命名,默认名不是列名,而是自动产生一个外键名

创建(CREATE)表时就指定外键约束的话,先创建主表,再创建从表

删表时,先删从表(或先删除外键约束),再删除主表

当主表的记录被从表参照时,主表的记录将不允许删除,如果要删除数据,需要先删除从表中依赖该记录的数据,然后才可以删除主表的数据

在从表中指定外键约束,并且一个表可以建立多个外键约束

从表的外键列与主表被参照的列名字可以不相同,但是数据类型必须一样,逻辑意义一致

当创建外键约束时,系统默认会在所在的列上建立对应的普通索引。但是索引名是外键的约束名。(根据外键查询效率很高)

删除外键约束后,必须手动删除对应的索引

4、添加外键约束

(1)建表时


create table 主表名称(
  字段1  数据类型  primary key,
    字段2  数据类型
);
create table 从表名称(
  字段1  数据类型  primary key,
    字段2  数据类型,
    [CONSTRAINT <外键约束名称>] FOREIGN KEY(从表的某个字段) references 主表名(被参考字段)
);
#(从表的某个字段)的数据类型必须与主表名(被参考字段)的数据类型一致,逻辑意义也一样
#(从表的某个字段)的字段名可以与主表名(被参考字段)的字段名一样,也可以不一样
-- FOREIGN KEY: 在表级指定子表中的列
-- REFERENCES: 标示在父表中的列


create table dept( #主表
  did int primary key,  #部门编号
    dname varchar(50)   #部门名称
);
create table emp(#从表
  eid int primary key,  #员工编号
    ename varchar(5),     #员工姓名
    deptid int,    #员工所在的部门
    foreign key (deptid) references dept(did)   #在从表中指定外键约束
    #emp表的deptid和和dept表的did的数据类型一致,意义都是表示部门的编号
);


说明: 主表dept必须先创建成功,然后才能创建emp表,指定外键成功。 删除表时,先删除从表emp,再删除主表dept


(2)建表后


语法格式:


ALTER TABLE 从表名 ADD [CONSTRAINT 约束名] FOREIGN KEY (从表的字段) REFERENCES 主表名(被引用字段) [on update xx][on delete xx];


举例:


ALTER TABLE emp1
ADD [CONSTRAINT emp_dept_id_fk] FOREIGN KEY(dept_id) REFERENCES dept(dept_id);


create table dept(
  did int primary key,  #部门编号
    dname varchar(50)   #部门名称
);
create table emp(
  eid int primary key,  #员工编号
    ename varchar(5),     #员工姓名
    deptid int    #员工所在的部门
);
#这两个表创建时,没有指定外键的话,那么创建顺序是随意


alter table emp add foreign key (deptid) references dept(did);


5、 约束等级(了解)

Cascade方式:在父表上update/delete记录时,同步update/delete掉子表的匹配记录


Set null方式:在父表上update/delete记录时,将子表上匹配记录的列设为null,但是要注意子表的外键列不能为not null


No action方式:如果子表中有匹配的记录,则不允许对父表对应候选键进行update/delete操作


Restrict方式:同no action, 都是立即检查外键约束


Set default方式(在可视化工具SQLyog中可能显示空白):父表有变更时,子表将外键列设置成一个默认的值,但Innodb不能识别


如果没有指定等级,就相当于Restrict方式。


对于外键约束,最好是采用: ON UPDATE CASCADE ON DELETE RESTRICT 的方式。


举例: on update cascade on delete cascade


create table dept(
  did int primary key,  
    dname varchar(50)   
);
create table emp(
  eid int primary key,  
    ename varchar(5),     
    deptid int,    
    foreign key (deptid) references dept(did)  on update cascade on delete cascade
    #即当删除或修改主表的primary key 对应列的值时,从表中的列数据也会对应删除
);


insert into dept values(1001,'教学部');
insert into dept values(1002, '财务部');
insert into dept values(1003, '咨询部');
insert into emp values(1,'张三',1001); #在添加这条记录时,要求部门表有1001部门
insert into emp values(2,'李四',1001);
insert into emp values(3,'王五',1002);
#删除主表的记录成功,主表的1001行被删除了,从表相应的记录也被删除了
delete from dept where did=1001;


如图所示:


image.png

6、删除外键约束

流程如下:

(1)第一步先查看约束名和删除外键约束
SELECT * FROM information_schema.table_constraints WHERE table_name = '表名称';#查看某个表的约束名
ALTER TABLE 从表名 DROP FOREIGN KEY 外键约束名;
(2)第二步查看索引名和删除索引。(注意,只能手动删除)
SHOW INDEX FROM 表名称; #查看某个表的索引名
ALTER TABLE 从表名 DROP INDEX 索引名;


举例:


SELECT * FROM information_schema.table_constraints WHERE table_name = 'emp';
ALTER TABLE emp DROP FOREIGN KEY emp_ibfk_1;
SHOW INDEX FROM emp;
ALTER TABLE emp DROP INDEX deptid;
SHOW INDEX FROM emp;


如图所示:

image.png


7、阿里开发规范

【强制】不得使用外键与级联,一切外键概念必须在应用层解决。


说明: 学生表中的 student_id 是主键,那么成绩表中的 student_id 则为外键。如果更新学生表中的 student_id,同时触发成绩表中的 student_id 更新,即为级联更新。外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。


相关实践学习
如何在云端创建MySQL数据库
开始实验后,系统会自动创建一台自建MySQL的 源数据库 ECS 实例和一台 目标数据库 RDS。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助 &nbsp; &nbsp; 相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
24天前
|
NoSQL 关系型数据库 MySQL
2024Mysql And Redis基础与进阶操作系列(4-2)作者——LJS[含MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法]
24MySQL非空、唯一性、PRIMARY KEY、自增列/自增约束举例说明等详解步骤及常见报错问题对应的解决方法(4-2) 学不会你来砍我!!!
|
1月前
|
Ubuntu 关系型数据库 MySQL
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
ubuntu使用aliyun源+mysql删除有外键约束的数据+查看特定目录的大小
37 4
|
2月前
|
SQL 关系型数据库 MySQL
MySQL中外键的使用及外键约束策略
这篇文章讨论了MySQL中使用外键的重要性,包括外键的概念、不使用外键可能导致的问题、如何设置外键约束以及不同的外键约束策略(如CASCADE和SET NULL),并通过示例演示了这些概念。
MySQL中外键的使用及外键约束策略
|
2月前
|
存储 关系型数据库 MySQL
MySQL数据库基础:约束
约束是对数据库表中字段施加的规则,确保数据的正确性、有效性和完整性。主要分为非空约束、唯一约束、默认约束、主键约束和外键约束。非空约束禁止字段值为null;唯一约束确保字段值唯一,允许null值重复;默认约束设定默认值;主键约束结合非空与唯一约束,并可设为自增型;外键约束则通过关联其他表的主键,保证数据一致性。检查约束确保字段值满足特定条件。
49 1
|
3月前
|
数据采集 关系型数据库 MySQL
在 MySQL 中使用约束
【8月更文挑战第11天】
63 0
在 MySQL 中使用约束
|
5月前
|
SQL 关系型数据库 MySQL
MySQL----约束
MySQL----约束
35 1
|
5月前
|
SQL 关系型数据库 MySQL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
MySQL外键约束行为解析:CASCADE, NO ACTION, RESTRICT, SET NULL
379 0
|
14天前
|
SQL 关系型数据库 MySQL
12 PHP配置数据库MySQL
路老师分享了PHP操作MySQL数据库的方法,包括安装并连接MySQL服务器、选择数据库、执行SQL语句(如插入、更新、删除和查询),以及将结果集返回到数组。通过具体示例代码,详细介绍了每一步的操作流程,帮助读者快速入门PHP与MySQL的交互。
29 1
|
16天前
|
SQL 关系型数据库 MySQL
go语言数据库中mysql驱动安装
【11月更文挑战第2天】
29 4
|
23天前
|
监控 关系型数据库 MySQL
数据库优化:MySQL索引策略与查询性能调优实战
【10月更文挑战第27天】本文深入探讨了MySQL的索引策略和查询性能调优技巧。通过介绍B-Tree索引、哈希索引和全文索引等不同类型,以及如何创建和维护索引,结合实战案例分析查询执行计划,帮助读者掌握提升查询性能的方法。定期优化索引和调整查询语句是提高数据库性能的关键。
114 1
下一篇
无影云桌面