06:mysql---约束

news2024/11/27 14:42:46

目录

1介绍

2:约束演示(建表)

3:外键约束    

4:外建行为

5:外建是否可以删除

6:多表查询


1介绍

1:概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

2:目的:保证数据库中数据的正确、有效性和完整性。

3:分类:

约束描述关键字
非空约束限制该字段的数据不能为nullnot null
唯一约束保证该字段的所有数据都是唯一、不重复的unique
主键约束主键是一行数据的唯一标识,要求非空且唯一primary key
默认约束保存数据时,如果未指定该字段的值,则采用默认值default
检查约束(8.0.16版本之后)保证字段值满足某一个条件check
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性foreign key
自增auto_increment

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束

2:约束演示(建表)

1:先建立表结构

create table user_a(
id int primary key  auto_increment comment"主键自增",
name varchar(10) not null unique comment "姓名",
age int check (age between 0 and 120 ) comment "年龄",
status char(1) default "1" comment"状态",
gender char(1) not null
) 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 ('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,gender) values ('Tom5',120,'男');

3:外键约束    

概念:外键用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性

写外建时不加行为(on update cascade on delete cascade) 父表的数据不能删除

注意:目前上述的两张表,在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

语法:

--添加外建
create table 表名 (

    字段名 数据类型,
    ........
    
    [constraint]  [文建名称] foreign key(外建字段名)  references 主表 (主表列名)

);

alter table 表名 add constraint 外建名称 foreign key (外建字段名) references 主表 (主表列名);

-->删除外键
alter table 表名 drop foreign key 外键名称;

准备数据

--准备数据
create table dept(
	id int auto_increment primary key  comment 'ID' ,
	name varchar(5) not null comment '部门名称'
) comment '部门表';
insert into dept (id,name) values  (1,'研发部'),(2,'市场部'),(3,'财务部'),(4,'销售部'),(5,'总经办');

create table emp(
	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 emp (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);

现在只是逻辑上存在外建练习,  需要使用代码在数据库层面加上外建关系

建立外建关系:

--添加外建
alter table 表名(子表) add constraint 外建名称 foreign key (外建字段名) references 主表 (主表列名);

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

现在给子表已经添加上外建了  ,我们尝试删除父表中的数据,   因为父表中的数据于子表中的数据发生关联,     数据库这个时候是不允许我们删除父表中的数据的.   保证了数据的完整性与一致性

删除外建----删除外建后我们就可以删除父表中的数据了:  

alter table emp drop foreign key fk_emp_dept_id;

4:外建行为

行为说明
no action当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT一致
restrict当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION 一致)
cascade当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
set null当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为null(这就要求该外键允许取nul)。
set default父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)

 写外建时加行为(on update cascade on delete cascade) 父表的数据可以删除

语法:

alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名 (主表字段名) on update cascade on delete cascade;
--外键的删除和更新行为
alter table emp add constraint fk_emp_dept_id foreign key (dept_id) references dept(id) on update cascade on delete cascade ;

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

5:外建是否可以删除

写外建时不加行为(on update cascade on delete cascade) 父表的数据不能删除;

 写外建时加行为(on update cascade on delete cascade) 父表的数据可以删除.

6:多表查询

概述:
项目开发中,在进行数据库表结构设计时,会根据业务需求及业务模块之间的关系,分析并设计表结构,由于业务之间相互关联,所以各个表结构之间也存在着各种联系,基本上分为三种:
一对多(多对一),        多对多,          一对一

一对多(多对一)

案例: 部门与员工的关系V
关系:一个部门对应多个员工,一个员工对应一个部门
实现: 在多的一方建立外键,指向一的一方的主键

 多对多

>案例: 学生与 课程的关系
>关系: 一个学生可以选修多门课程,一门课程也可以供多个学生选择
>实现: 建立第三张中间表,中间表至少包含两个外键,分别关联两方主键 

​​​​​​​

 数据准备:


--数据的准备
create table student (
	id int auto_increment primary key comment '主键',
	name varchar(10),
	no varchar(10) comment'学号'
)comment '学生表';
insert into student values (null,'燃绮丝','280100101'),(null,'谢逊','2000100102'),(null,'假天正','2000100103'),(null,'韦-笑','20');

create table course(
	id int auto_increment primary key ,
	name varchar(10)
)comment '课程表';
insert into course values (null, 'Java'), (null, 'PHP'), (null , 'MySQL') , (null, 'Hadoop')

create table student_course(
	id int auto_increment comment '主键' primary key,
	studentid int not null comment'学生ID',
	courseid int not null comment  '课程ID',
	constraint fk_courseid foreign key (courseid) references course (id),
	constraint fk_studentid foreign key (studentid) references student (id)
	)comment'学生课程中间表';
	
insert into student_course values (null,1,1),(null,1,2),(null,1,3),(null,2,2),(null,2,3),(null,3,4);

 一对一

案例: 用户与用户详情的关系
关系:一对一关系,多用于单表拆分,将一张表的基础字段放在一张表中,其他详情字段放在另一张表中,以提升操作效率

实现: 在任意一方加入外键,关联另外一方的主键,并且设置

​​​​​​​

 数据:


create table tb_user(
	id int auto_increment primary key ,
	name varchar(10) comment'姓名',
	age int comment'年龄',
	gender char(1) comment'1: 男 ,2: 女',
	phone char(11) comment'手机号'

 ) comment'用户基本信息表';

create table tb_user_edu(
	id int auto_increment primary key comment'主键ID',
	degree varchar(20) ,
	major varchar(50) comment '专业',
	primaryschool varchar(5) comment'小学',
	middleschool varchar(50) comment'中学',
	university varchar(5) comment '大学',
	userid int unique comment'用户ID',
	constraint fk_userid foreign key (userid) references tb_user(id)
	) comment '用户教育信息表';
	

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/551214.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

ESP32S3---eFuse固化VDD_SPI释放GPIO45

使用esp-idf里面的esptool_py工具集吧.首先切换到工具所在目录. 比如WROOM设置(默认ttyUSB0或者ttyACM0): espefuse.py set_flash_voltage 3.3V 对于WROVER设置(默认ttyUSB0或者ttyACM0): espefuse.py set_flash_voltage 1.8V 运行后会提示你输入BURN,然后确认才能写,因为…

Vue电商项目--平台售卖属性和的排序操作制作

平台售卖属性的操作 就是点击平台的售卖属性,下面显示对应的内容 这里我们要借助这个props属性 这里块是平台的售卖属性,我们在这里绑定回调,一点击就把id传给父组件 我们需要把这俩个参数传进入 商品属性的数组: ["属性ID:属性值:…

FFmpeg学习:FFmpeg4数据结构分析

FFmpeg数据结构分析 FFMPEG中结构体很多。最关键的结构体可以分成以下几类: 1、解协议(http,rtsp,rtmp,mms) AVIOContext,URLProtocol,URLContext主要存储视音频使用的协议的类型以及状态。URLProtocol存储输入视音…

【软件工程题库】第一章 软件工程概述

🕺作者: 迷茫的启明星 学习路线C语言从0到1C初阶数据结构从0到1 😘欢迎关注:👍点赞🙌收藏✍️留言 🏇码字不易,你的👍点赞🙌收藏❤️关注对我真的很重要&…

View的事件分发机制

View的事件分发机制 View的事件分发机制主要分为三点 ,第一点是Activity将点击事件分发给ViewGroup 第二点是ViewGroup将事件自己处理或者分发给子View 第三点便是子View自行处理,或者子View处理不了转交给ViewGroup 现在依次来看 Activity对点击事件的分发过程 Activit…

运用go语言的模板(template)写的第一个程序示例

一、模板(template)与渲染 模板其实就相当于一个简历模板,上面的格式都是已经确定了的渲染就是往对应的地方填写相应的数据 二、模板 模板文件通常定义为.tmpl和.tpl为后缀(也可以使用其他的后缀),必须…

手把手带你利用苹果手机使用美区礼品卡升级ChatGPT Plus,轻松搞定!

大家好,我是五竹。 昨天用苹果手机尝试了一下,借助App Store(苹果应用商店)升级 Plus,成功了!一共升级了三个号!有两个一气呵成,轻松搞定。最后一个可能触发风控了,但第…

OOB配对原理及应用

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 目录 前言一、OOB是啥?二、OOB配对实践总结 前言 本文先简单介绍OOB配对的流程,然后结合CC2652蓝牙芯片调试OOB配对 一、OOB是啥? OOB就是…

博客系统后端设计(六) -实现登录页面要求强制登录功能

文章目录 实现页面要求强制登录实现思路1.约定前后端交互接口2.实现后端代码3.修改前端代码 实现页面要求强制登录 当用户访问列表页/详情页/编辑页的时候,要求用户已经是登录的状态了, 如果用户还没登录,就会强制跳转到登录页面。 实现思路…

一文盘点PoseiSwap近期的生态利好

PoseiSwap 是 Nautilus Chain 上首个 DEX,其继承了 Nautilus Chain 的模块化、Layer3 以及 Zk-rollup 所带来的优势(TPS 在 2000),包括吞吐量、安全度、隐私性等。基于 Nautilus Chain,PoseiSwap 也将具备基于 Zk 的隐…

Ceph crush运行图

Crush map介绍 ceph集群中由monitor负责维护的运行图包括: Monitor map:监视器运行图osd map:osd运行图PG map:PG运行图Crush map:crush运行图Mds map:mds运行图 crush map是ceph集群物理拓扑的抽象&…

HTML、PHP实战:搭建一个网页登录页面。

一、实验环境。 MySQL5.7.26 FTP0.9.60 Apache2.4.39 我这里用的是PHPstudy小皮一键搭建的。 数据库 二、登录页面。 登录页面前端代码 文件名&#xff1a;denglu.html <html> <head> <meta charset"UTF-8"> <title>登录界面</ti…

StarRocks 极速全场景 MPP 数据库介绍及使用

一、简介 StarRocks 是一款高性能分析型数据仓库&#xff0c;使用向量化、MPP 架构、CBO、智能物化视图、可实时更新的列式存储引擎等技术实现多维、实时、高并发的数据分析。既支持从各类实时和离线的数据源高效导入数据&#xff0c;也支持直接分析数据湖上各种格式的数据。兼…

Linux基本指令3

目录 一.基本常用指令 指令1&#xff1a;find命令&#xff1a; 指令2&#xff1a;which命令&#xff1a; 指令3&#xff1a;alias命令&#xff1a; 指令4&#xff1a;whereis which&#xff0c;find&#xff0c;whereis这三个搜索命令的区别&#xff1a; 指令5&#xff…

Vue初始

一、Vue的概述 Vue 发音类似 view Vue 游雨溪 鱿鱼须 鱿鱼须不懂Vue Vue历史 Angular React Vue 2013 Seed 2013 Seed命名为Vue 2014 Vue正式发布 0.8 - 0.10 2015 6.13 0.12 2015下半年 vue-cli vueRouter vueX 版本好1.0 vue正式跨入大众 渐进式框架(JQuery) 2016国…

[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解

[CTF/网络安全]攻防世界unserialize3解题详析及php序列化反序列化实例讲解 _wakeup()及php序列化反序列化序列化字符串结构分析_wakeup()的利用 解题思路伪属性数量绕过 解题姿势总结 _wakeup()及php序列化反序列化 序列化是指将数据结构或对象转换为可传输或可存储的格式的过…

14.Kafka系列之K8S部署集群

1. 部署方式选择 基于Kafka3.X后的集群搭建方式主要分为两种&#xff0c;一种是基于Zookeeper管理方式&#xff0c;一种是基于KRaft模式&#xff0c;本文主要介绍Kafka-KRaft集群模式搭建 纠正文章1.Kafka系列之K8S部署单节点中基于Zookeeper方式的部署方式错误&#xff0c;其…

Godot引擎 4.0 文档 - 入门介绍 - Godot设计理念

本文为Google Translate英译中结果&#xff0c;DrGraph在此基础上加了一些校正。英文原版页面&#xff1a; Godots design philosophy — Godot Engine (stable) documentation in English Godot设计理念 既然你已经了解了&#xff0c;让我们来谈谈 Godot 的设计。 每个游戏…

(转载)MATLAB智能算法30个案例分析(1)——遗传算法工具箱

以下内容大部分来源于《MATLAB智能算法30个案例分析》&#xff0c;仅为学习交流所用。 1理论基础 1.1遗传算法概述 遗传算法(genetic algorithm,GA)是一种进化算法,其基本原理是仿效生物界中的“物竞天择、适者生存”的演化法则。遗传算法是把问题参数编码为染色体,再利用迭代…

第11届蓝桥杯Scratch选拔赛真题集锦

目录 一、编程题 第11届蓝桥杯Scratch选拔赛真题集锦 一、编程题 第 1 题 问答题 马克思的手稿 题目说明 背景信息: 马克思手稿中有一道趣味数学问题: 有30个人&#xff0c;其中有男人、女人和小孩。在一家饭馆吃饭共花了50先令;每个男人花了3先令&#xff0c;每个女人花了…