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

MySQL——表的约束

表约束

一、概念

​ 表中一定要有各种约束,通过各种约束使得未来插入到数据库中的数据是合法的,在语法上是没有问题的;

​ 约束本质就是通过技术手段,倒逼着程序员插入正确的数据,换句话说就是,插入进来的数据一定是符合数据约束的;最终保证数据的完整性和可预期性;

二、非空约束

select null;#NULL表示没有,不区分大小写;

在这里插入图片描述

select 1+null;#实际上null是不会参与计算的

在这里插入图片描述

​ 空属性有两个值,分别是null(默认值)和not null;创建表时除了写表属性和类型之外还可以添加null和not null分别表示允许为空和不允许为空;

在这里插入图片描述

​ Null列表示是否启用空属性约束;默认约束是Null,由于不启用空约束所以就不允许插入缺省值了;

三、默认约束

​ 常用的某一个具体值,可以一开始就指定好,用户需要显式传递时允许用户传入其需求值;

​ default和not NULL并不冲突,当用户显示插入对应属性时,可以插入NULL或者合法数据,当不插入数据时,如果设置了default就会自动插入缺省值,没设置就必须用户显示插入;

​ MySQL默认的default值是NULL;

四、comment约束

​ 相当于属性字段的注释,用于程序员和DBA进行了解;

create table 表名(属性名 属性类型 非空约束 默认约束 comment '属性注释');

五、zerofill约束

create table 表名(属性名 属性类型 非空约束 默认约束 comment '属性注释'zerofill);
#zerofill表示是否启用;

​ 关于显示方面的约束;如果显示的宽度小于指定的宽度,使用zerofill填充之后就会使用0填充指定的宽度;如果数据的宽度大于zerofill约束指定宽度,还是可以正常显示,所以zerofill是一种至少的行为;

​ int是4个字节,无符号显示出来就是十个位,有符号还有符号位所以是十一位;

六、主键约束

​ 主键:primary key用来唯一约束该字段里面的数据,不能重复,不能为空,一张表里面只能有一个主键;

create table 表名(属性名 属性类型 非空约束 默认约束 zerofill primary key comment '属性注释');
create table 表名(属性名 属性类型 非空约束 默认约束 zerofill comment '属性注释',primary key('属性名'));

​ 存在的意义就是:使得属性唯一标识,不可以被修改,便于增删查改;

alter table 表名 add primary key(属性字段);
alter table 表名 drop primary key;

​ 主键也可以添加到多列,即复合主键,仍然是一个主键;

​ 严格的按照一对一的关系,不允许同一个记录重复出现;

6.1自增长约束

​ auto_increment是主键的一种,插入数据时可以不用考虑它,每次在插入数据时都会自动地进行最大数据加一;**自增长约束一般都必须设置成主键;自增长字段必须是整数;一张表只能有一个自增长;**常用于索引;

create table if not exists t2(id int unsigned primary key auto_increment,name varchar(20) not null
)auto_increment=5;Create Table: CREATE TABLE `t2` (`id` int(10) unsigned NOT NULL AUTO_INCREMENT,`name` varchar(20) NOT NULL,PRIMARY KEY (`id`)) ENGINE=InnoDB AUTO_INCREMENT=5 DEFAULT CHARSET=utf8
#除了表内属性进行了优化,表外属性也自动添加AUTO_INCREMENT=5,表明下一次插入时会使用的主键值;每次插入玩=完成之后会更新AUTO_INCREMENT字段;

​ 补充:索引的本质就是以空间换时间,为kv映射关系提供了专门的空间,便于快速定位;索引和主键相关

七、唯一键约束

create table t3(id char(20) unique comment '这是一个学生的唯一键学号',name varchar(32) not null
);Create Table: CREATE TABLE `t3` (`id` char(20) DEFAULT NULL COMMENT '这是一个学生的唯一键学号',`name` varchar(32) NOT NULL,UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | char(20)    | YES  | UNI | NULL    |       |
| name  | varchar(32) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+

​ 唯一键与逐渐最大的不同就是可以为空,并且空可以重复;

​ 他们之间互为补充,其中选择了主键作为索引,但是其他的属性逻辑上也要保证唯一性,所以需要有唯一键来保证唯一性;

八、外键约束

​ 外键常用于主表和从表之间建立联系;即从表中有属性与主表的主键或者唯一键属性相关联,此时就需要使用外键建立联系;

create table if not exists student(id int primary key,name varchar(20) not null,telephone varchar(20) unique key,class_id int,foreign key(class_id) references class(id)
);Create Table: CREATE TABLE `student` (`id` int(11) NOT NULL,`name` varchar(20) NOT NULL,`telephone` varchar(20) DEFAULT NULL,`class_id` int(10) unsigned DEFAULT NULL,PRIMARY KEY (`id`),UNIQUE KEY `telephone` (`telephone`),KEY `class_id` (`class_id`),CONSTRAINT `student_ibfk_1` FOREIGN KEY (`class_id`) REFERENCES `class` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8+-----------+------------------+------+-----+---------+-------+
| Field     | Type             | Null | Key | Default | Extra |
+-----------+------------------+------+-----+---------+-------+
| id        | int(11)          | NO   | PRI | NULL    |       |
| name      | varchar(20)      | NO   |     | NULL    |       |
| telephone | varchar(20)      | YES  | UNI | NULL    |       |
| class_id  | int(10) unsigned | YES  | MUL | NULL    |       |
+-----------+------------------+------+-----+---------+-------+

​ 外键既可以保证从表插入时,需要符合约束条件,也可以保证从表外键约束有数据时不可以删除主表内容;

​ 定义外键时必须保证外键列数据在主表中存在或者为空;

九、综合案例

​ 约束会保证凡是进入mysql中的数据一定是符合规定的;

一个商店的数据记录客户端及客户购物情况,由三个表组成;

​ 商品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);

要求:

​ 每个表的主外键;

​ 客户的姓名不能为空值;

​ 邮箱不能重复;

​ 客户的性别(男,女);

-- 创建数据库
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)
);

相关文章:

  • 使用Flask ORM进行数据库操作的技术指南
  • 卷积神经网络(CNN)详细介绍及其原理详解
  • 力扣279. 完全平方数
  • 赶紧收藏!2024 年最常见 20道 Redis面试题(四)
  • 《Python编程从入门到实践》day37
  • 小林coding笔记
  • 英语学习笔记24——Give me/us/him/her/them some ...
  • 5.23小结
  • 【vue-3】动态属性绑定v-bind
  • JPHS-JMIR Public Health and Surveillance
  • Java设计模式-中介者模式(20)
  • SpringBoot前置知识02-spring注解发展史
  • 【js刷题:数据结构链表之环形链表】
  • LitCTF
  • Unity Render入门
  • Asm.js的简单介绍
  • CentOS7 安装JDK
  • create-react-app项目添加less配置
  • CSS 提示工具(Tooltip)
  • linux学习笔记
  • nfs客户端进程变D,延伸linux的lock
  • PHP 使用 Swoole - TaskWorker 实现异步操作 Mysql
  • ucore操作系统实验笔记 - 重新理解中断
  • vue+element后台管理系统,从后端获取路由表,并正常渲染
  • 基于MaxCompute打造轻盈的人人车移动端数据平台
  • 罗辑思维在全链路压测方面的实践和工作笔记
  • 使用agvtool更改app version/build
  • 首页查询功能的一次实现过程
  • 在weex里面使用chart图表
  • const的用法,特别是用在函数前面与后面的区别
  • 数据可视化之下发图实践
  • ​secrets --- 生成管理密码的安全随机数​
  • ###项目技术发展史
  • (JSP)EL——优化登录界面,获取对象,获取数据
  • (Note)C++中的继承方式
  • (rabbitmq的高级特性)消息可靠性
  • (含react-draggable库以及相关BUG如何解决)固定在左上方某盒子内(如按钮)添加可拖动功能,使用react hook语法实现
  • (机器学习-深度学习快速入门)第三章机器学习-第二节:机器学习模型之线性回归
  • (理论篇)httpmoudle和httphandler一览
  • (十六)一篇文章学会Java的常用API
  • (算法)Travel Information Center
  • (转)全文检索技术学习(三)——Lucene支持中文分词
  • .libPaths()设置包加载目录
  • .NET Core中Emit的使用
  • .net MVC中使用angularJs刷新页面数据列表
  • .net web项目 调用webService
  • .NET 应用架构指导 V2 学习笔记(一) 软件架构的关键原则
  • .NET/C# 使用反射注册事件
  • .netcore 如何获取系统中所有session_ASP.NET Core如何解决分布式Session一致性问题
  • .NET版Word处理控件Aspose.words功能演示:在ASP.NET MVC中创建MS Word编辑器
  • .NET运行机制
  • @for /l %i in (1,1,10) do md %i 批处理自动建立目录
  • @JsonSerialize注解的使用
  • [ Linux ] git工具的基本使用(仓库的构建,提交)
  • [acwing周赛复盘] 第 69 场周赛20220917