当前位置: 首页 > news >正文

【数据库】MySQL表的约束

首先表的约束是什么?

表的约束就是未来在插入数据库中的表中的数据是符合预期的。当我们在向表中插入数据时,如果我们插入的数据和表中的类型不相符,那么数据库就会约束我们提醒我们插入正确的数据。

约束的最终目标就是保存数据的完整正确性和符合要求。

为了更好的使用表我们需要更多的约束条件。

一.空属性(Null属性)

之前我们在desc table查看表的时候会看到表后面有这样几组数据

那么这些就是表的约束

首先是Null,也就是空属性

 我们先创建一个表来认识并描述这个属性

create table if not exists myclass(
class_name varchar(20) not null, 
class_room varchar(20) not null, 
othher varchar(20) );

这是我们建表时在我们的属性后面带上not null

建表成功后我们desc 命令可以看class_name和class_room 的Null属性不是空的(我们在建表时规定了not null)

 当我们在三个字段中插入了数据

可以看到我们添加的数据都被添加进了表中

 

当我们第二次插入数据时没有插入other字段内容,此时查看表的内容other字段的内容被默认设置为NULL, 

当我们第三次插入数据时,没有规定class_room,此时插入出错 ,提示我们class_room插入违规;

当我们第四次插入数据时,规定了class_room插入字段为NULL,此时他也提示我们class_room插入不能为空。

所以我们在设计数据库表的时候,一定要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是“约束”。

二.默认值(default属性)

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。如果用户选择不使用自己的数据,那么默认值就会生效。

我们依然先创建一个表

并且在age字段和gender字段后加上我们默认的缺省值

当我们第一次向表内插入数据时,我们全部使用自己的数据

 可以看到表内都是我们刚刚自己插入的数据

第二次插入数据我们选择直插入姓名

 可以看到年龄和性别都设置为了我们建表时期的默认值。

同时default和not null 并不冲突,而是互相补充的。

接下来再创建一个表,不用null和default

当我们没有设置默认值时,只插入了年龄,可以看到name为NULL

所以我们要明白是null约束了自己还是default约束了自己。 

三.列描述

列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解。

mysql> create table tt12 (-> name varchar(20) not null comment '姓名',-> age tinyint unsigned default 0 comment '年龄',-> sex char(2) default '男' comment '性别'-> );

我们先使用命令创建一个表,并且在创建的字段后加上comment描述字段 

通过desc查看不到注释信息:

mysql> desc tt12;
+-------+---------------------+------+-----+---------+-------+
| Field | Type                | Null | Key | Default | Extra |
+-------+---------------------+------+-----+---------+-------+
| name | varchar(20)          | NO   |     | NULL  |    |
| age  | tinyint(3) unsigned  | YES  |     | 0     |    |
| sex  | char(2)              | YES  |     | 男    |    |
+-------+---------------------+------+-----+---------+-------+

 通过show可以看到:

mysql> show create table tt12\G
*************************** 1. row ***************************Table: tt12
Create Table: CREATE TABLE `tt12` (
`name` varchar(20) NOT NULL COMMENT '姓名',
`age` tinyint(3) unsigned DEFAULT '0' COMMENT '年龄',
`sex` char(2) DEFAULT '男' COMMENT '性别'
) ENGINE=MyISAM DEFAULT CHARSET=gbk
1 row in set (0.00 sec)

 通过以上命令就可以查看表中字段的注释。

四.zerofill(0填充)

这个约束是关于显示方面的约束,我们同样创建表举例证明

 可以看到我们在创建表时并没有指明int的大小,但是表中的int 中出现了(10),这是因为我们的MySQL操作会被后台的Mysqld收到,他会在后台做出一些优化,进行的动态的调整。

我们在t17中给a插入1,b插入2 

 

看到插入进去了

此时我们修改t17表的b的属性

再展示表的内容

就可以看到b有十位数了。

这就是zerofill(0填充)的操作,当我们创建表或者修改表的时候如果特意声明了zerofill,那么就会在我们的表格中补0。

当我们在尝试插入更多的数据

可以看到虽然插入的数据已经多于0填充的位数,但是依旧可以插进去,他只是可以帮我们做格式化显示。

五.主键约束

primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个
主键;主键所在的列通常是整数类型。

首先我们先创建表时先用primary约束

 create table if not exists test_key (id int unsigned primary key comment '这是学生的学号', name varchar(20) not null 
);

这次的表我们发现id字段在Key被标上了PRI,以为主键列

接下来我们继续往里插入数据

展示一下表的内容

 此时我们将张飞换成刘备,id还是为1;

可以看到相同的值他不会让你插入了,只有我们修改主键的值才能继续插入

当id值只有一个和时,我们便可以精准的找到他,并且可以精准的对其进行增删查改

 虽然每个表只能有一个主键,但并不意味着表中的主键只能添加给一列。

一个主键可以被添加到一列,或者多列上,添加在多列上就叫做符合主键。

我们可以创建一个表来演示

mysql> create table tt14(
-> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键
-> );
Query OK, 0 rows affected (0.01 sec)
mysql> desc tt14;
+--------+---------------------+------+-----+---------+-------+
| Field  | Type                | Null | Key | Default | Extra |
+--------+---------------------+------+-----+---------+-------+
| id     | int(10) unsigned    | NO   | PRI | 0       |    |     <= 这两列合成主键
| course | char(10)            | NO   | PRI |         |    |
| score  | tinyint(3) unsigned | YES  |     | 60      |    |
+--------+---------------------+------+-----+---------+-------+

id和course合起来成为一个主键

当我们向里面插入数据的时候两个主键的内容不能是相同的,否则会受到主键的约束。

可以看到报错的内容是'1235-40' ,所以这两个主键合在一起被称为一个主键。

那这个例子也是再说一个人可以选不同的课程,但是一个人不能选相同的课程。 

六.唯一键

我们直接建表来认识唯一键

可以看到我们给id这是为了唯一键

我们再向表中插入几组数据

可以看到NULL也是可以插入进去的,而且可以多次的插入,NULL并不会引起冲突

唯一键的本质和主键差不多,唯一键允许为空,且可以多个为空,而主键不能为空。

我们可以简单理解成,主键更多的是标记唯一性的,而唯一键保证的是不和别的信息出现重复。

这里的道理有些绕,我们再建表举例说明

我们将id设为主键,电话和名字没有添加任何约束,并且向表中插入三条数据

可以看到因为id为主键约束所以不能插入相同的,而数据中wdd和wjl 的电话却是相同的,从逻辑上来讲我们的电话没有相同的,所以这里插入数据出错了。

这里的意思就是说我们主键需要保持唯一性,但是不可否认的是我们的电话号没有相同的,所以我们的电话号码也需要保持唯一性。

七.外键约束

外键用于定义主表和从表之间的关系,也就是注重的是表和表之间的关联:外键约束主要定义在从表上,主表则必须是有主键约束或unique 约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。 

我们看以下案例

如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据冗余,我们只需要设计成让stu->class_id和myclass->id形成关联的关系,那就是外键约束。

在这里我们将班级表称为主表

学生表成为从表,也就是说班级表要学生表要依附于班级表。

学生表是通过class_id来与班级表的id产生关联的 

我们对上面的表使用语句设计

首先是学生表:

create table if not exists student(id int unsigned primary key auto_increment,name varchar(20) not null,telphone varchar(32) not null,class_id int);

 

然后是班级表:

create table if not exists class(id int primary key,name varchar(32) not null);

我们设计表时尽量先有班级,后有学生,因为学生是依附于班级的。

所以我们不妨先新建两个班级 

此时我们向班级内插入学生

 

可以看到我们张三对应的class_id为1,但是没有明确的班级的信息

此时我们需要加上判断条件

就可以查找出id为1的班级的信息。

我们继续插入信息

 

但是我们发现wdd 的班级id为3,是不存在与班级表中的,虽然插入进了表中,但是不符合实际。 

所以现在看班级表和学生表两张表时,我们在使用当中要两张表关联在一起才能合理使用,并没有真正意义上的将信息约束在一起。

 所以我们需要构建外键约束。

因为从表和主表产生联系,所以我们需要先删除从表

drop table student;

同时在建立一个新的从表

 

 create table if not exists student(id int unsigned primary key,name varchar(20) not null,telphone varchar(32) unique key,class_id int,foreign key(class_id) references class (id));

可以看到最后一行代码

外键约束的语法为

foreign key (字段名) references 主表(列) 

我们需要和班级表中的id建立联系所以我们需要将class_id和id联系起来,语法如上。

这就是指明外键列和主表的列产生关系。

接下来就可以完整的观察外键约束

首先学生表是空表

我们需要向内插入数据

可以看到一班和二班都能插入学生

 当我们插入班级为三的人时

可以看到他不允许我们做插入,因为因为外键的约束所以不允许插入我们与外键约束无关的数据。

反过来要是能插入的数据,一定是符合外键约束的。

当我们要删除与外键关联的表时,是不可以直接删除的。

 外键约束保证了表和表之间联系的逻辑关系以及数据的完整性。

综合案例

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商 provider)

客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)

购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

要求:

1.每个表的主外键

2.客户的姓名不能为空值

3.邮箱不能重复

4.客户的性别(男,女)

-- 创建数据库
create database if not exists bit32mall
default character set utf8 ;
-- 选择数据库
use bit32mall;
-- 创建数据库表
-- 商品
create table if not exists goods
(goods_id  int primary key auto_increment comment '商品编号',goods_name varchar(32) not null comment '商品名称',unitprice  int  not null default 0 comment '单价,单位分',category  varchar(12) comment '商品分类',provider  varchar(64) not null comment '供应商名称'
);
-- 客户
create table if not exists customer
(customer_id  int primary key auto_increment comment '客户编号',name varchar(32) not null comment '客户姓名',address  varchar(256) comment '客户地址',email  varchar(64) unique key comment '电子邮箱',
sex  enum('男','女') not null comment '性别',card_id char(18) unique key comment '身份证'
);
-- 购买
create table if not exists purchase
(order_id  int primary key auto_increment comment '订单号',customer_id int comment '客户编号',goods_id  int comment '商品编号', nums  int default 0 comment '购买数量',foreign key (customer_id) references customer(customer_id),foreign key (goods_id) references goods(goods_id)
);

以上就是关于表的约束的内容,其实总的来说是为了防止我们在使用MySQL时插入不合法的内容。

如果以上内容对你有所帮助还请三联支持,感谢您的阅读。

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • QT-贪吃蛇小游戏
  • 【自动化】一共获取6600多公司信息【逆向】一页15还加密。
  • S7通信协议从入门到精通_1_Sharp7(C#)类编写西门子 S7系列 plc驱动程序(扩展C++语言)
  • springCloud 网关(gateway)配置跨域访问
  • MyBatis中的#{}和${}区别、ResultMap使用、MyBatis常用注解方式、MyBatis动态SQL
  • spark全面个人总结(20个面试点)非网文 持续更新中
  • C语言 ——— 常见的动态内存错误(上篇)
  • Parallels Desktop 19 for Mac 安装虚拟机需要激活吗
  • 在不训练模型的情况下强化语言模型
  • 在idea中的git选择某一次记录拉出一个新分支
  • 软考:软件设计师 — 15.数据结构及算法应用
  • 企业级NoSql数据库Redis集群
  • Go 语言切片(Slice)
  • 结构化克隆算法是啥?
  • GoFly快速开发框架已经全部支持市面上见到的主流数据库
  • 【Leetcode】104. 二叉树的最大深度
  • Android开源项目规范总结
  • java8 Stream Pipelines 浅析
  • Java的Interrupt与线程中断
  • JS数组方法汇总
  • Mysql优化
  • php的插入排序,通过双层for循环
  • Three.js 再探 - 写一个跳一跳极简版游戏
  • 阿里云购买磁盘后挂载
  • 阿里中间件开源组件:Sentinel 0.2.0正式发布
  • -- 查询加强-- 使用如何where子句进行筛选,% _ like的使用
  • 番外篇1:在Windows环境下安装JDK
  • 技术胖1-4季视频复习— (看视频笔记)
  • 将回调地狱按在地上摩擦的Promise
  • 如何借助 NoSQL 提高 JPA 应用性能
  • 如何用Ubuntu和Xen来设置Kubernetes?
  • 什么是Javascript函数节流?
  • #NOIP 2014# day.1 T3 飞扬的小鸟 bird
  • #QT(串口助手-界面)
  • (11)工业界推荐系统-小红书推荐场景及内部实践【粗排三塔模型】
  • (27)4.8 习题课
  • (Pytorch框架)神经网络输出维度调试,做出我们自己的网络来!!(详细教程~)
  • (Redis使用系列) Springboot 使用redis实现接口幂等性拦截 十一
  • (vue)el-cascader级联选择器按勾选的顺序传值,摆脱层级约束
  • (附源码)springboot 智能停车场系统 毕业设计065415
  • (经验分享)作为一名普通本科计算机专业学生,我大学四年到底走了多少弯路
  • (五)大数据实战——使用模板虚拟机实现hadoop集群虚拟机克隆及网络相关配置
  • (转)nsfocus-绿盟科技笔试题目
  • .Net - 类的介绍
  • .Net 高效开发之不可错过的实用工具
  • .NET单元测试
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .sh 的运行
  • /usr/bin/env: node: No such file or directory
  • @Transactional注解下,循环取序列的值,但得到的值都相同的问题
  • []Telit UC864E 拨号上网
  • [8] CUDA之向量点乘和矩阵乘法
  • [AI Google] Ask Photos: 使用Gemini搜索照片的新方法
  • [Angular] 笔记 6:ngStyle
  • [Bugku] web-CTF靶场系列系列详解⑥!!!