0102 MySQL05

news2025/7/24 5:09:22

1.约束

1.约束(constraint):在创建表时,可以给表中的字段加上一些约束,保证表中数据的完整性,有效性


常见的约束?

非空约束:not null

唯一性约束:unique

主键约束:primary key(简称PK)

外键约束:foreign key(简称FK)

检查约束:check(MySQL不支持,Oracle支持)

补充:xxx.sql这种文件称为sql脚本文件,执行该脚本文件时,该文件中的所有SQL语句会全部执行,批量的执行SQL语句,可以使用sql脚本文件

怎么执行?mysql>source D:\xxxxx\xxx.sql


1.非空约束

not null约束的字段不能为null

drop table if exists t_vip;

create table t_vip(

        id int,

        name varchar(255) not null

);

insert into t_vip(id,name) values(1,'zhangsan');

insert into t_vip(id,name) values(2,'lisi');

insert into t_vip(id) values(3);//报错,name字段没有默认值


2.唯一性约束

1.unique约束的字段不能重复

drop table if exists t_vip;

create table t_vip(

        id int,

        name varchar(255) unique,

        email varchar(255)

);

insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');

insert into t_vip(id,name,email) values(2,'lisi','lisi@123.com');

insert into t_vip(id,name,email) values(3,'zhangsan','zhangsan@456.com');//报错,name值重复

insert into t_vip(id) values(3);//可以为null

2.新需求:name和email两个字段联合起来具有唯一性

drop table if exists t_vip;

create table t_vip(

        id int,

        name varchar(255) unique,

        email varchar(255) unique

);//不符合需求,表示各自唯一

drop table if exists t_vip;

create table t_vip(

        id int,

        name varchar(255) ,

        email varchar(255) ,

        unique (name,email)

);//两个字段联合起来唯一

测试:

insert into t_vip(id,name,email) values(1,'zhangsan','zhangsan@123.com');

insert into t_vip(id,name,email) values(2,'zhangsan','zhangsan@456.com');

//不报错

约束直接添加到列后面:列级约束

约束没有添加到列后面:表级约束(多个字段联合起来唯一时使用)

not null只有列级约束,没有表级约束

3.unique和not null可以联合吗?

drop table if exists t_vip;

create table t_vip(

        id int,

        name varchar(255) not null unique

);//name为主键

//在MySQL中,如果一个字段同时被not null和unique约束时,该字段自动变成主键字段

(Oracle中不适用)


3.主键约束

1.primary key相关术语?

主键约束:一种约束

主键字段:字段添上主键约束,这样的字段

主键值:主键字段中的每一个值

2.什么是主键?有什么用?

主键值是每一行记录的唯一标识,是每一行记录的身份证号

任何一张表都应该有主键,没有主键的表无效

特征:not null + unique(不能是空,也不能重复)

3.给表添加主键约束?

drop table if exists t_vip;

create table t_vip(

        id int primary key,

        name varchar(255)

);

insert into t_vip(id,name) values(1,'zhangsan');

insert into t_vip(id,name) values(1,'lisi');//报错,主键重复

//主键可以使用表级约束

一个字段做主键:单一主键

字段联合做主键:复合主键(在实际开发中不建议使用)

4.主键约束数量?

drop table if exists t_vip;

create table t_vip(

        id int primary key,

        name varchar(255) primary key

);//报错,一张表只能添加一个,即主键只能有一个

5.主键值建议使用类型?

int,bigint,char等类型

不建议使用varchar做主键,一般是数字,且定长

6.自然主键和业务主键?

自然主键:主键值是一个自然数,和业务无关

业务主键:主键值和业务紧密关联,如拿银行卡账号做主键

在实际开发中,使用自然主键较多,因为主键只要做到不重复,不需要有意义,

和业务挂钩,当业务发生变动时,可能影响主键值

7.在MySQL中,有一种机制可以帮助我们自动维护一个主键值?

drop table if exists t_vip;

create table t_vip(

        id int primary key auto_increment,

        name varchar(255) 

);

insert into t_vip(name) values('zhangsan');

insert into t_vip(name) values('zhangsan');

insert into t_vip(name) values('zhangsan');

//auto_increment表示自增,从1开始递增


4.外键约束

1.foreign key相关术语:

外键约束、外键字段、外键值

2.业务背景:

设计数据库表,描述‘班级‘和’学生‘的信息?

第一种方案:班级和学生存储在一张表中t_student

no(pk)nameclassnoclassname
1jack001高三1班
2tom001高三1班
3zhangsan002        高三2班
4wangwu002高三2班

以上方案的缺点:数据冗余,空间浪费

第二种方案:班级一张表,学生一张表t_class,t_student

classno(pk)classname
001高三1班
002高三2班

no(pk)namecno(班级编号)
1jack001
2tom001
3zhangsan002
4wangwu002

当班级编号没有任何约束时,可能导致数据无效

为了保证学生表中班级编号有效,需要添加外键约束

那么classno就是外键字段,字段中的每一个值就是外键值

注:被引用的t_class的是父表,t_student是子表

删除表,删除数据顺序:先删子表,再删父表

创建表,插入数据顺序:先创父表,再创子表

drop table if exists t_student;

drop table if exists t_class;

create table t_class(

        classno int primary key,

        classname varchar(255)

);

create table t_student(

        no int primary key auto_increment,

        name varchar(255),

        cno int,

        foreign key(cno) references t_class(classno)

);

insert into t_class(classno,classname) values(001,高三1班);

insert into t_class(classno,classname) values(002,高三2班);

insert into t_student(name,cno) values(jack,001);

insert into t_student(name,cno) values(tom,001);

insert into t_student(name,cno) values(zhangsan,002);

insert into t_student(name,cno) values(wangwu,002);

3.子表中的外键引用父表中的某个字段,被引用的这个字段必须是主键吗?

不一定是主键,但至少具有unique唯一性

外键可以为null吗?

insert into t_student(name) values(lisi);//可以为null


2.存储引擎(了解)

1.存储引擎:是MySQL中特有的术语,是一个表存储数据的方式,不同的存储引擎,表存储数据的方式不同

2.怎么给表指定’存储引擎‘?

show create table t_student;

可以在建表的时候给表指定存储引擎,可以在最后小括号’)‘的右边使用:

ENGINE来指定存储引擎

CHARSET来指定这张表的字符编码方式

MySQL默认的存储引擎是InnoDB,默认字符编码方式utf8

create table t_product(

        id int primary key,

        name varchar(255)

)engine=InnoDB default charset=gbk;

3.怎么查看MySQL支持哪些存储引擎?

show engines \G

MySQL支持九大存储引擎

4.常用的存储引擎?(了解)

MyISAM存储引擎,它管理表具有以下特征:

使用三个文件表示每个表:

        格式文件:存储表结构的定义(mytable.frm)

        数据文件:存储表行的内容(mytable.MYD) 

        索引文件:存储表上索引(mytable.MYI):索引是一本书的目录,缩小扫描范围

对于一张表来说,只要是主键或有unique约束的字段会自动创建索引

优势:可被转化为压缩、只读表来节省空间

不支持事务,安全性低


InnoDB存储引擎

是MySQL默认的存储引擎,支持事务,支持数据库崩溃后自动恢复机制

它管理表具有以下特征:

        每个InnoDB表在数据库目录中以.fm格式文件表示

        InnoDB表空间tablespace被用于存储表的内容(表空间是逻辑名称,表空间存储数据+索引)

        提供一组用来记录事务性活动的日志文件

        用COMMIT(提交)、SAVEPOINT及ROLLBACK(回滚)支持事务处理

        支持外键及引用的完整性,包括级联删除和更新

特点:非常安全


MEMORY存储引擎(之前被称为HEAP引擎)

其数据存储在内存中,且行的长度固定,这两个特点使MEMORY存储引擎非常快

它管理表具有以下特征:

        在数据库目录内,每个表均以.frm格式的文件表示

        表数据及索引被存储在内存中(查询快)

        表级锁机制

        不能包含TEXT或BLOB字段

优点:查询效率最高

不安全,关机之后数据消失,因为数据和索引都在内存

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

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

相关文章

在VM16.X虚拟机上安装Android-X86 9.0

前提:电脑已安装好VM虚拟机, 第一步:下载好安卓9.0系统 https://www.fosshub.com/Android-x86.html 第二步:开始安装 1、新建虚拟机(按图片上的点一下步) 点浏览,确定虚拟机位置 处理器配置建…

深度剖析C语言预处理

致前行的人: 人生像攀登一座山,而找寻出路,却是一种学习的过程,我们应当在这过程中,学习稳定冷静,学习如何从慌乱中找到生机。 目录 1.程序翻译过程: 2.字符串宏常量 3.用宏定义充当注释符号 4…

【笔记】若依不分离的$.modal.open()打开多个子窗口,关闭子窗口刷新父窗口问题

前言 如题所述,当前遇到的问题是:我在若依不分离版的一个普通HTML页面A使用 $.modal.open()打开一个子窗口B,且在这个子窗口里再次使用 这个函数打开一个子窗口C,这时的情况就是 A 界面有子窗口 B, B 窗口又有一个子…

《系统架构设计》-06-面向领域思想和策略设计

文章目录1 面向领域思想1.1 架构设计与领域驱动1.1.1 领域驱动设计1.1.2 使用领域驱动设计的条件1.2 领域驱动设计核心概念1.2.1 策略维度1.2.2 技术维度2. 面向领域的策略设计2.1 通用语言2.2 领域与上下文2.2.1 架构轮回2.2.2 系统拆分子域界限上下文系统拆分策略2.2.3 上下文…

Mysql—主从复制

主从复制 创建mysql 基于docker创建2个mysql容器 1、拉取mysql镜像,这里拉取最新的8.0.20 docker pull mysql:latest2、使用镜像运行两个mysql容器:mysql 和 mysql-2 docker run -itd --name mysql -p 3306:3306 -e MYSQL_ROOT_PASSWORDroot mysql …

Ubuntu系统升级16.04升级18.04

一、需求说明 作为Linux发行版中的后起之秀,Ubuntu 在短短几年时间里便迅速成长为从Linux初学者到实验室用计算机/服务器都适合使用的发行版,目前官网最新版本是22.04。Ubuntu16.04是2016年4月发行的版本,于2019年4月停止更新维护。很多软件支…

C++学习笔记之提高

目录C提高一.模板1.1.函数模板1.1.1语法1.1.2.普通函数与函数模板的区别1.1.3.普通函数与函数模板的调用规则1.1.4.模板的局限性1.2.类模板1.2.1.类模板与函数模板的区别1.2.2.类模板中的成员函数的创建时机1.2.3.类模板做函数的参数1.2.4.类模板与继承1.2.5.类模板成员函数类外…

cesium——飞行定位

Cesium的飞行定位,主要通过Viewer、Camera这两个类实现的。其中viewer.flyTo()、camera.flyTo()、camera.flyToBoundingSphere()这三个方法会有一个飞行动画的效果,所以会有飞行持续时间参数duration,默认是3秒。一、viewerflyTotarget&#…

电子台账:定义产品的行业代码和产品代码

1 简介水平过滤模板和垂直过滤模板定义好后,就可以进行数据抓取了。首次数据抓取后,用产品名称对产品代码表进行填充,程序会提示补充完善产品代码表,需要人工对产品代码表中的信息进行完善。产品代码表补充完整后,以后…

【微信小程序】如何使用阿里巴巴的icon自定义图标以及简单的下拉框组件实现全过程

前言 小编我将用CSDN记录软件开发之路上所学的心得与知识,有兴趣的小伙伴可以关注一下!也许一个人独行,可以走的很快,但是一群人结伴而行,才能走的更远!让我们在成长的道路上互相学习,让我们共…

CUDA By Example笔记--线程协作

1--使用线程实现GPU上的矢量求和 完整代码&#xff1a; # include <iostream> # define N (33 * 1024)__global__ void add(int* a, int* b, int* c){int tid threadIdx.x blockIdx.x * blockDim.x;while (tid < N){c[tid] a[tid] b[tid];tid blockDim.x * grid…

pyqt 小项目

此项目是别人用Q开发的&#xff0c;我模仿用Pyqt编写。仿写过程种发下c 和python在调用时还是有些不一样。遇到行不通时就要多尝试别的方法。不如在C里可以直接在cpp文件里传入QBrush和QPen对象&#xff0c;而在python里就不行&#xff0c;估计使用信号与槽可以&#xff08;本人…

IfcRepresentationContext 与 IfcRepresentation

IfcRepresentationContext 与 IfcRepresentation 1. IfcRepresentationContext IfcRepresentationContext 定义了成果&#xff08;Product&#xff09;的IfcRepresentation相关上下文。 The IfcRepresentationContext defines the context to which the IfcRepresentation of…

通过堆栈分析深拷贝、浅拷贝、赋值的差异

前言数据类型分为&#xff1a;基本数据类型String、Number、Boolean、Null、Undefined、Symbol对象数据类型Object、Array基本数据类型的特点&#xff1a;直接存储在栈(stack)中的数据引用数据类型的特点&#xff1a;存储的是该对象在栈中引用&#xff0c;真实的数据存放在堆内…

云原生时代顶流消息中间件Apache Pulsar部署实操之轻量级计算框架

文章目录Pulsar Functions(轻量级计算框架)基础定义工作流程函数运行时处理保证和订阅类型窗口函数定义窗口类型滚动窗口滑动窗口函数配置函数示例有状态函数示例窗口函数示例自定义函数开发定义原生语言接口示例Pulsar函数SDK示例Pulsar Functions(轻量级计算框架) 基础定义 …

实验一:递归

1.铺砖 题目描述&#xff1a; 对于一个2行N列的走道。现在用12或22的砖去铺满。问有多少种不同的方式&#xff08;请用递推方式求解&#xff09;。如果N很大&#xff0c;需要高精度计算。下图是一个2行17列的走道的某种铺法&#xff1a; 输入要求&#xff1a; 一个整数N&a…

GitHub Copilot 全新升级,工作效率提升 55%

2021年 6 月&#xff0c;GitHub 和 OpenAI 推出了 GitHub Copilot 预览版&#xff0c;可根据命名或者正在编辑的代码上下文为开发者提供代码建议&#xff0c;被称为“你的 AI 结对程序员”。 近日&#xff0c;GitHub 宣布&#xff0c;经过去年 12 月以来的短暂测试后&#xff…

Spring基本概念与使用

文章目录一、Spring概念1.容器2.IoC3.DI4.Ioc与DI的关系二、Spring创建与使用1.Maven2.添加Spring框架支持注&#xff1a;国内的Maven源配置3.简单实例&#xff08;1&#xff09;创建一个Bean对象。&#xff08;2&#xff09;将Bean对象存储到Spring当中&#xff08;3&#xff…

JavaWeb基础

Servlet 是在服务器上运行的小程序。这个词是在 Java applet的环境中创造的&#xff0c;Java applet 是一种当作单独文件跟网页一起发送的小程序&#xff0c;它通常用于在客户端运行&#xff0c;结果得到为用户进行运算或者根据用户互作用定位图形等服务。服务器上需要一些程序…

Jenkins最新版安装调试

清理旧的jenkins&#xff1a; find / -name jenkins* 一项一项的清理&#xff1a;rm -rf /var/log/jenkins* 下载最新版jenkins镜像&#xff1a;jenkins-redhat-stable安装包下载_开源镜像站-阿里云 上传到服务器&#xff1a; 安装命令&#xff1a; yum install -y jenkins…