MySQL 学习笔记之约束与外键

2024-08-25 05:28

本文主要是介绍MySQL 学习笔记之约束与外键,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

文章目录

      • MySQL 约束与外键
        • 1. 约束(Constraints)
          • 示例代码:
          • 插入数据:
        • 2. 外键约束与操作
          • 示例代码:
          • 外键的删除与更新行为:
          • 示例:
      • 完整代码

MySQL 约束与外键

在数据库设计中,约束(Constraints)和外键(Foreign Keys)是保证数据完整性和一致性的重要工具。本文将结合代码示例详细介绍MySQL中的主要约束类型以及外键的使用。


1. 约束(Constraints)

约束是对数据库表中列的规则,用于限制数据的类型和范围,确保数据的准确性和可靠性。常见的约束包括:

  • 非空约束(NOT NULL)
    非空约束用于确保列的值不能为空,即列的每一行数据都必须有值。
    语法:column_name data_type NOT NULL

  • 唯一约束(UNIQUE)
    唯一约束保证列中的所有值都是唯一的,即不能有重复值。
    语法:column_name data_type UNIQUE

  • 主键约束(PRIMARY KEY)
    主键用于唯一标识表中的一条记录,主键要求列的值既唯一又不能为空。每个表只能有一个主键。
    语法:column_name data_type PRIMARY KEY

  • 默认约束(DEFAULT)
    默认约束为列设置一个默认值,当插入数据时如果没有为该列指定值,则使用默认值。
    语法:column_name data_type DEFAULT default_value

  • 检查约束(CHECK)
    检查约束用于确保列的值满足特定条件。
    语法:column_name data_type CHECK (condition)

  • 外键约束(FOREIGN KEY)
    外键用于建立两张表之间的连接,确保子表中的值在父表中存在,以保证数据的完整性。
    语法:FOREIGN KEY (column_name) REFERENCES parent_table(column_name)


示例代码:
create table user
(id     int primary key auto_increment comment '主键',name   varchar(10) not null unique comment '姓名',age    int check ( age > 0 and age <= 120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '用户表';

在这个 user 表的定义中:

  • id 列被设置为主键,且自动递增。
  • name 列要求非空且唯一。
  • age 列有一个检查约束,要求年龄在0到120岁之间。
  • status 列有一个默认值 '1'
  • gender 列可以为空。

插入数据:
insert into user (name, age, status, gender)
values ('Tom1', 19, '1', '男');

该代码插入一条符合约束条件的记录。
如果尝试插入违反约束的记录,如 name 列为空或 age 列的值超出0到120的范围,将会导致插入失败并抛出错误。




2. 外键约束与操作

外键是用于在两张表之间建立关系的关键,它确保子表中的值在父表中存在,从而维护数据的完整性。

示例代码:

首先,我们创建了两个表 deptempl,分别表示部门表和员工表。


创建部门表

create table dept
(id   int auto_increment comment ' ID' primary key,name varchar(50) not null comment ' 部门名称 '
) comment ' 部门表 ';

创建员工表

create table empl
(id        int auto_increment comment ' ID' primary key,name      varchar(50) not null comment ' 姓名 ',age       int comment ' 年龄 ',job       varchar(20) comment ' 职位 ',salary    int comment ' 薪资 ',entrydate date comment ' 入职时间 ',managerid int comment ' 直属领导 ID',dept_id   int comment ' 部门 ID'
) comment ' 员工表 ';

添加外键约束
empl 表中的 dept_id 列与 dept 表中的 id 列关联:

alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id);

这个外键约束确保了 empl 表中的 dept_id 必须在 dept 表中存在对应的 id

外键的删除与更新行为:

MySQL支持在父表记录被删除或更新时对子表中的相关记录进行相应的操作,常见行为包括:

  • NO ACTION: 当在父表中删除或更新记录时,如果子表中存在关联的外键记录,则不允许删除或更新。
  • RESTRICT: 与 NO ACTION 类似,不允许删除或更新。
  • CASCADE: 当在父表中删除或更新记录时,子表中相关的外键记录也会被相应删除或更新。
  • SET NULL: 当在父表中删除记录时,子表中的相关外键列会被设置为NULL。

示例:
alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id) on update cascade on delete cascade;

在这个例子中,当 `dept` 表中的 `id` 被更新或删除时,`empl` 表中的 `dept_id` 将自动进行相应的更新或删除。

如果我们改为:

alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id) on update set null on delete set null;

那么在 dept 表中的 id 被更新或删除时,empl 表中的 dept_id 则会被设置为 NULL




完整代码

/*
约束     描述                                          关键字
非空约束  限制该字段的数据不能为null                        not null
唯一约束  保证该字段的所有数据都是唯一的、不重复的              unique
主键约束  主键使一行数据的唯一标识,要求非空且唯一              primary key
默认约束  保存数据时,如果未指定该字段的值,则采用默认值         default
检查约束  保证字段值满足某一个条件                          check
外键约束  用来让两张表的数据之间建立连接,保证数据一致性和完整性  foreign key
*/-- ------------------------------------------ 约束演示 -----------------------------------------
-- 准备数据
create table user
(id     int primary key auto_increment comment '主键',name   varchar(10) not null unique comment '姓名',age    int check ( age > 0 and age <= 120 ) comment '年龄',status char(1) default '1' comment '状态',gender char(1) comment '性别'
) comment '用户表';-- 插入数据
insert into user (name, age, status, gender)
values ('Tom1', 19, '1', '男'),('Tom2', 25, '0', '男');
insert into user (name, age, status, gender)
values ('Tom3', 19, '1', '男');insert into user (name, age, status, gender)
values (null, 19, '1', '男');
insert into user (name, age, status, gender)
values ('Tom3', 19, '1', '男');insert into user (name, age, status, gender)
values ('Tom4', 80, '1', '男');
insert into user (name, age, status, gender)
values ('Tom5', -1, '1', '男');
insert into user (name, age, status, gender)
values ('Tom5', 121, '1', '男');insert into user (name, age, gender)
values ('Tom5', 120, '男');-- ------------------------------------------- 约束(外键)---------------------------------------
-- 准备数据
create table dept
(id   int auto_increment comment ' ID' primary key,name varchar(50) not null comment ' 部门名称 '
) comment ' 部门表 ';
INSERT INTO dept (id, name)
VALUES (1, ' 研发部 '),(2, ' 市场部 '),(3, ' 财务部 '),(4, ' 销售部 '),(5, ' 总经办 ');create table empl
(id        int auto_increment comment ' ID' primary key,name      varchar(50) not null comment ' 姓名 ',age       int comment ' 年龄 ',job       varchar(20) comment ' 职位 ',salary    int comment ' 薪资 ',entrydate date comment ' 入职时间 ',managerid int comment ' 直属领导 ID',dept_id   int comment ' 部门 ID'
) comment ' 员工表 ';INSERT INTO empl (id, name, age, job, salary, entrydate, managerid, dept_id)
VALUES (1, ' 金庸 ', 66, ' 总裁 ', 20000, ' 2000-01-01', null, 5),(2, ' 张无忌 ', 20, ' 项目经理 ', 12500, ' 2005-12-05', 1, 1),(3, ' 杨逍 ', 33, ' 开发 ', 8400, ' 2000-11-03', 2, 1),(4, ' 韦一笑 ', 48, ' 开发 ', 11000, ' 2002-02-05', 2, 1),(5, ' 常遇春 ', 43, ' 开发 ', 10500, ' 2004-09-07', 3, 1),(6, ' 小昭 ', 19, ' 程序员鼓励师 ', 6600, ' 2004-10-12', 2, 1);-- 添加外键
/*
create table 表名(字段名 数据类型,...[cinstraint] [外键名称] foreign key(外键字段名) references 主表(主表列名)
);alter table 表名 add constraint 外键名称 foreign key (外键名称) references 主表(主表列名);
*/
alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id);-- 删除外键
-- alter table 表名 drop foreign key 外键名称;
alter table empldrop foreign key fk_emp_dept_id;-- 删除/更新行为
/*
行为          说明
no action    当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致)
restrict     当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION 一致
cascade      当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
set null     当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为nul.(这就要求该外键允许取u1)。
set default  父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)ALTER TABLE 表名 ADD ONSTRANT 外键名称 FOREIGN KEY 外字) REFERENCES 丰表名(主表字段名) ON UPDATE CASCADF ON DFIFTF CASCADFI;
*/alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id) on update cascade on delete cascade;alter table empladd constraint fk_emp_dept_id foreign key (dept_id) references dept (id) on update set null on delete set null;

这篇关于MySQL 学习笔记之约束与外键的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1104670

相关文章

Mysql 中的多表连接和连接类型详解

《Mysql中的多表连接和连接类型详解》这篇文章详细介绍了MySQL中的多表连接及其各种类型,包括内连接、左连接、右连接、全外连接、自连接和交叉连接,通过这些连接方式,可以将分散在不同表中的相关数据... 目录什么是多表连接?1. 内连接(INNER JOIN)2. 左连接(LEFT JOIN 或 LEFT

mysql重置root密码的完整步骤(适用于5.7和8.0)

《mysql重置root密码的完整步骤(适用于5.7和8.0)》:本文主要介绍mysql重置root密码的完整步骤,文中描述了如何停止MySQL服务、以管理员身份打开命令行、替换配置文件路径、修改... 目录第一步:先停止mysql服务,一定要停止!方式一:通过命令行关闭mysql服务方式二:通过服务项关闭

SQL Server数据库磁盘满了的解决办法

《SQLServer数据库磁盘满了的解决办法》系统再正常运行,我还在操作中,突然发现接口报错,后续所有接口都报错了,一查日志发现说是数据库磁盘满了,所以本文记录了SQLServer数据库磁盘满了的解... 目录问题解决方法删除数据库日志设置数据库日志大小问题今http://www.chinasem.cn天发

mysql主从及遇到的问题解决

《mysql主从及遇到的问题解决》本文详细介绍了如何使用Docker配置MySQL主从复制,首先创建了两个文件夹并分别配置了`my.cnf`文件,通过执行脚本启动容器并配置好主从关系,文中还提到了一些... 目录mysql主从及遇到问题解决遇到的问题说明总结mysql主从及遇到问题解决1.基于mysql

MySQL的索引失效的原因实例及解决方案

《MySQL的索引失效的原因实例及解决方案》这篇文章主要讨论了MySQL索引失效的常见原因及其解决方案,它涵盖了数据类型不匹配、隐式转换、函数或表达式、范围查询、LIKE查询、OR条件、全表扫描、索引... 目录1. 数据类型不匹配2. 隐式转换3. 函数或表达式4. 范围查询之后的列5. like 查询6

Linux下MySQL8.0.26安装教程

《Linux下MySQL8.0.26安装教程》文章详细介绍了如何在Linux系统上安装和配置MySQL,包括下载、解压、安装依赖、启动服务、获取默认密码、设置密码、支持远程登录以及创建表,感兴趣的朋友... 目录1.找到官网下载位置1.访问mysql存档2.下载社区版3.百度网盘中2.linux安装配置1.

PostgreSQL如何用psql运行SQL文件

《PostgreSQL如何用psql运行SQL文件》文章介绍了两种运行预写好的SQL文件的方式:首先连接数据库后执行,或者直接通过psql命令执行,需要注意的是,文件路径在Linux系统中应使用斜杠/... 目录PostgreSQ编程L用psql运行SQL文件方式一方式二总结PostgreSQL用psql运

HarmonyOS学习(七)——UI(五)常用布局总结

自适应布局 1.1、线性布局(LinearLayout) 通过线性容器Row和Column实现线性布局。Column容器内的子组件按照垂直方向排列,Row组件中的子组件按照水平方向排列。 属性说明space通过space参数设置主轴上子组件的间距,达到各子组件在排列上的等间距效果alignItems设置子组件在交叉轴上的对齐方式,且在各类尺寸屏幕上表现一致,其中交叉轴为垂直时,取值为Vert

Ilya-AI分享的他在OpenAI学习到的15个提示工程技巧

Ilya(不是本人,claude AI)在社交媒体上分享了他在OpenAI学习到的15个Prompt撰写技巧。 以下是详细的内容: 提示精确化:在编写提示时,力求表达清晰准确。清楚地阐述任务需求和概念定义至关重要。例:不用"分析文本",而用"判断这段话的情感倾向:积极、消极还是中性"。 快速迭代:善于快速连续调整提示。熟练的提示工程师能够灵活地进行多轮优化。例:从"总结文章"到"用

SQL中的外键约束

外键约束用于表示两张表中的指标连接关系。外键约束的作用主要有以下三点: 1.确保子表中的某个字段(外键)只能引用父表中的有效记录2.主表中的列被删除时,子表中的关联列也会被删除3.主表中的列更新时,子表中的关联元素也会被更新 子表中的元素指向主表 以下是一个外键约束的实例展示