MySQL(表的约束)

目录

1. 空属性(NULL)

2. 默认值(default)

3. 列描述(comment)

4. zerofill

5. 主键(primary_key)

6. 自增长(auto_increment)

7. 唯一键(uniqie)

8. 外键(foreign key (字段名) references 主表(列)


表的约束:表中有各种类型,每个类型插入的数据都要是合法的,不然插入失败,所以表的约束就是让使用者正确的插入数据,约束本质是通过技术手段,倒逼使用者插入正确的数据来保证未来数据库表中的数据一定符合数据约束的,如果采用文件存储数据,想插入什么类型就插入什么类型,无约束可言。

约束的最终目标保证数据的完整性和可预期性。

1. 空属性(NULL)

1. 两个值: null (默认的)和 not null( 不为空 )
2. 数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空办
法参与运算。
在C语言中 NULL表示 0 / '\0' ,在MySQL中NULL就表示什么都没有。
示例:创建一个表 2个字段,一个姓名不能为空,一个兴趣爱好可以为空。
create table if not exists test9(
name varchar(20) not null,
hobby varchar(30)
);

如果不指定是否为空,则大部分类型默认是允许为空,显然 name指定后 列属性 NULL 是 NO 不允许为空。

第一条数据插入,name和hobby都不为NULL。

第二条数据插入,name不为空,hobby(创建该字段时没有给默认的缺省值,MySQL会优化自动加上默认的缺省值)用的是defalut缺省值NULL。

橙色区域插入失败:只指定插入hoppy,而name(创建的时候指定不能为空,MySQL不会进行优化,也就是默认添加默认的缺省值)没有默认的缺省值,所以插入失败。

绿色区域插入失败:指定name数据为NULL,显然前面创建的时候指明不能为NULL,所以插入失败。

2. 默认值(default)

1. 默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

示例:创建一个表 2个字段,一个姓名不能为空,一个测试1设置缺省值,一个测试2不能为空,有缺省值。

create table test10(
name varchar(20) not null,
test1 char(10) default '这是默认值test1',
test2 char(10) not null default '这是默认值test2'
);

第一次插入:只插入name列,忽略test1和test2,test1有默认值插入,test2不能为NULL,但test2有默认值也能插入,所以在忽略别的 列的情况下 和为不为空没关系,只跟是否有默认的缺省值有关系。

第二次插入:只插入name列和test2列,忽略test1,test1有默认值插入。

第三次插入:全列插入,test2不允许为空,所以插入失败,说明在不忽略插入的情况下只与为不为空有关系,与默认的缺省值没关系。

第四次插入:忽略name列:name列创建的时候指定不能为空,后面没有默认的缺省值,所以插入失败。

是否为空和默认的缺省值是相辅相成的:如果忽略的情况下看是否有默认的缺省值,如果指定插入的情况下看是否可以为空。

3. 列描述(comment)

列描述: comment ,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或 DBA来进行了解。
比如管理数据库的人员不知道某个字段是什么意思,就可以查看当时创建添加的描述信息。
查看comment描述字段
show create table table_name

4. zerofill

创建表

create table t17(
a int unsigned not null,
b int unsigned not null
);

我们发现表结构的类型创建的时候就一个int,而实际后面多了个(10),这是mysqld进行处理后的结果,那是什么意思呢?下面在列属性后面添加zerofill属性,并修改括号里的值为4。

插入数据:

当插入的数据位数小于该类型括号里的值时,少的位数自动往左补零,如果超过了则什么也不干,实际存储的是实际输入的数据,并不会影响后续的操作。

那么mysqld默认给的10是什么含义呢?10个位数也就是10几亿,无符号int取值范围 0~42亿多,刚好10位,而有符号的取值范围 -42亿多~42亿多,所以无符号的默认应该给11位,多的以为用来存高位符号位。

如果没加zerofill,则括号里的值是没有意义的,加了zerofill只是显示的时候会格式化,不会影响实际存储的值。

5. 主键(primary_key)

1. primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个。
2. 主键所在的列通常是整数类型。
创建表:
// 第一种创建方式
create table test12(
id int unsigned primary key,
age char(1)
);

//第二种创建方式
create table test12(
id int unsigned,
age char(1),
primary key(id)
);

添加了主键的字段默认不能为空,也不会添加默认的缺省值。

插入数据:

第三条插入: 主键对应的字段中不能重复,一旦重复,操作失败。
删除主键/添加主键:
// 添加主键
alter table table_name add primary key(字段1,字段2.....);

// 去掉主键
alter table table_name drop primary key;
复合主键:可以把一个字段当成一个主键,也可以把多个字段当成一个主键(整体)。
插入数据:
前3次插入虽然有部分重复值,但和之前插入的值没有全部重复所以能插入,后2次插入和之前插入的某个值全重复了,所以插入失败。

6. 自增长(auto_increment)

auto_increment :当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
1. 自增长的特点: 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
2. 自增长字段必须是整数
3. 一张表最多只能有一个自增长

创建表:

create table test13(
    -> id int primary key auto_increment,// 必须和主键搭配使用,且类型为整数
    -> name varchar(10) not null  // 一张表只能有一个自增长,主键也只有一个
    -> )auto_increment=1;         // 所以一般主键和自增长搭配使用
     // 可指定增长起始值

插入数据:

不指定插入带自增长的列字段,系统会从当前字段中已经有的最大值+1操作。

如果指定插入带自增长的字段,系统就会自动更新指定插入的值。

在插入后获取上次插入的 AUTO_INCREMENT 的值(批量插入获取的是第一个值)
select last_insert_id();

7. 唯一键(uniqie)

一张表中可能有多个字段需要具有唯一性,但主键只能有一个,而唯一键也是也可以让字段具有唯一性,且可以有多个唯一键。

  唯一键和主键的区别:唯一键可以为NULL,主键不能为NULL,NULL不参与计算。

比如人的身份信息:身份证,电话号码,QQ号,标识人的唯一性当然是身份证(主键),电话号码和QQ号对于人也是唯一的,也需要标识(外键)。

创建表:

create table test14(
id int primary key(,
qq varchar(15) unique
// 可以在这里指定 primary key(字段1,字段2...)/unique(字段1,字段2...)
);

主键是不允许为NULL的,唯一键默认是为NULL的。

插入数据:

第一次插入正确。

第二次插入唯一键冲突,插入失败。

第三次插入唯一键可以为NULL,插入正确。

第四次插入NULL值不参与计算,插入正确。

也可以把唯一键设置成not null,就跟主键一样了,但唯一键可以有多个,虽然主键和唯一键都可以保证数据的唯一性,但他们的侧重点不一样。

8. 外键(foreign key (字段名) references 主表()

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

学生表为从表,班级表为主表,学生表的class_id字段跟班级表的id字段建立关系,class_id就称为外键约束,如果不建立外键约束,相当于2个表物理上没有关系,但逻辑上未来插入的学生表的class_id必须在班级表的id里,如果没有外键约束,也就是没有关联起来,在逻辑上是不允许的,但物理上能插入进去,如果添加了外键约束,2张表建立了关系,学生表插入班级表没有的id值就会受外键约束,从而插入失败,反之将来学生表的id数据都是在班级表id当中的。

创建学生表:

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

创建班级表:

create table class(
id int primary key,
courses varchar(10)
);

给班级表插入数据:

给学生表插入数据:

第一次插入和第二次插入中的class_id都在主表班级表中的id列存在,插入成功。

第三次插入3就不在class_id主表班级表中的id列中,插入失败。

也可以插入NULL。

如果想删除主表(班级表)中的列数据,则主表(班级表)的id对应的从表(学生表)中class_id不存在要删除的主表(班级表)的id。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

笔记本电脑升级硬盘存储、Windows10系统安装及后续步骤(以联想ThinkPad X1 Carbon Gen10为例)

文章目录 1.前言2.材料准备3.Win10系统安装盘制作3.1 系统下载3.2 系统启动U盘刻录 4.拆机更换硬盘5.开机启动项修改6.系统安装(以Win10为例)7.系统安装后可能需要的步骤7.1 缺少WIFI等网络驱动7.2 系统激活7.3 办公软件安装 8.旧硬盘变废为宝参考文献 1…

高效利用资源:分布式有状态服务的高可靠性设计

在分布式系统设计中,实现有状态服务的高可靠性通常采用主备切换的方式。当主服务停止工作时,备服务接管任务,例如通过Keepalive实现VIP的切换以保证可用性。然而,这种方式存在资源浪费的问题,因为备服务始终处于空转状…

解读数据资产管理实践白皮书(5.0版)深入学习掌握数据资产管理知识体系。

本文介绍了数据资产管理的重要性及其概述,详细阐述了数据资产管理的活动职能包括数据模型管理、数据标准管理、数据质量管理等,并强调了数据安全管理的重要性。文章还讨论了数据资产管理的保障措施和实践步骤,以及发展趋势和总结展望。 重点内…

使用IP自签名SSL证书

最近需要创建WebSocket服务器并使用SSL证书,由于是内网测试,所以需要使用指定IP的自签SSL证书。 其实笔者前面博文 使用nexus3作为Docker镜像仓库 解决nexus3登录x509: certificate has expired or is not yet valid 中有创建过相应的证书,这…

location和重定向、代理

location匹配的规则和优先级 在nginx当中,匹配的对象一般是URI来匹配 http://192.168.233.62/usr/local/nginx/html/index.html 182.168.233.61/ location匹配的分类: 多个location一旦匹配其中之一,不在匹配其他location 1、精确匹配 …

Maven学习(传统Jar包管理、Maven依赖管理(导入坐标)、快速下载指定jar包)

目录 一、传统Jar包管理。 (1)基本介绍。 (2)传统的Jar包导入方法。 1、手动寻找Jar包。并放置到指定目录下。 2、使用IDEA的库管理功能。 3、配置环境变量。 (3)传统的Jar包管理缺点。 二、Maven。 &#…

【Java笔记】LinkedList 底层结构

一、LinkedList 的全面说明 LinkedList底层实现了双向链表和双端队列特点可以添加任意元素(元素可以重复),包括null线程不安全,没有实现同步 二、LinkedList 的底层操作机制 三、LinkedList的增删改查案例 public class LinkedListCRUD { public stati…

Linux中的线程

目录 线程的概念 进程与线程的关系 线程创建 线程终止 线程等待 线程分离 原生线程库 线程局部存储 自己实现线程封装 线程的优缺点 多线程共享与独占资源 线程互斥 互斥锁 自己实现锁的封装 加锁实现互斥的原理 死锁 线程同步 线程的概念 回顾进程相关概念 …

django应用JWT(JSON Web Token)实战

文章目录 一、什么是JWT二、为什么使用JWT三、在django项目中如何应用JWT 1、安装djangorestframework-simplejwt库:2、在settings.py中配置JWT认证:3、在urls.py中配置JWT的获取和刷新路由: 四、JWT如何使用 1、调用生成JWT的接口获取JWT2、…

如何借助5G网关实现油罐车安全在线监测

油罐车是常见的特种运输车辆,用以运送各种汽油、柴油、原油等油品,运输危险系数大,而且由于油罐车需要经常行驶在城区道路,为城市各个加油站点、企业工厂运输补充所需油料,因此也是危化品运输车辆的重点监测和管控对象…

EXCEL数据清洗的几个功能总结备忘

目录 0 参考教材 1 用EXCEL进行数据清洗的几个功能 2 删除重复值: 3 找到缺失值等 4 大小写转换 5 类型转化 6 识别空格 0 参考教材 精通EXCEL数据统计与分析,中国,李宗璋用EXCEL学统计学,日EXCEL统计分析与决策&#x…

知行之桥EDI系统V2024 12月9111版本更新

知行之桥EDI系统V2024于12月推出版本更新(版本号:9111),在原有产品的基础上进行了一系列的新增、更改和修复,以确保 EDI 和 MFT 集成尽可能的简单化。 主要特性 新增 新增EDI 交易伙伴管理控制台 交易伙伴管理控制台…

PDF 文件如何转为 CAD 图纸?PDF2CAD 使用教程

在工程设计和建筑行业中,PDF 文件常常被用来分享和存档图纸。然而,当需要对这些图纸进行编辑或进一步开发时,静态的 PDF 格式就显得力不从心了。这时候,将 PDF 文件转换为可编辑的 CAD(计算机辅助设计)格式…

JAVA守护线程和本地线程的区别?

大家好,我是锋哥。今天分享关于【JAVA守护线程和本地线程的区别?】面试题。希望对大家有帮助; JAVA守护线程和本地线程的区别? 在 Java 中,守护线程(Daemon Thread)和本地线程(User…

SpringBoot中集成常见邮箱中容易出现的问题

本来也没打算想写得。不过也是遇到一些坑&#xff0c;就记录一下吧&#xff0c;也折腾了小半天 1.maven配置 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-mail</artifactId></dependency>2…

数据分析与可视化:用 Python 处理、分析与展示数据

数据分析与可视化&#xff1a;用 Python 处理、分析与展示数据 Python 在数据分析领域有着非常强大的生态和灵活性&#xff0c;从数据清洗、处理&#xff0c;到分析、可视化&#xff0c;它几乎无所不能。今天&#xff0c;我们一起来聊聊如何用 Python 处理、分析和展示数据&…

Chrome浏览器调用ActiveX控件--allWebOffice控件

背景 allWebOffice控件能够实现在浏览器窗口中在线操作文档的应用&#xff08;阅读、编辑、保存等&#xff09;&#xff0c;支持编辑文档时保留修改痕迹&#xff0c;支持书签位置内容动态填充&#xff0c;支持公文套红&#xff0c;支持文档保护控制等诸多办公功能&#xff0c;…

ESXI6.7开启SSH密码通过Xshell登录

背景 近期服务器安装了ESXI6.7&#xff0c;想通过SSH到终端把/var/log/下的所有日志文件下载下来 解决方案 1、esxi开启ssh登录 2、选择Troubleshooting Options 3、开启SSH 4、打开ESXi的web页面&#xff0c;设置开启shell 5、使用Xshell连接&#xff0c;方法一定要勾选Keybo…

Vue宏观理解

文章目录 1 Vue是什么2 前端运行环境和工具3 环境搭建3.1 node.js安装3.2 Vite环境安装 4 Vue项目开发4.1 Vue项目开发开发方式4.2 Vue项目结构4.3 启动Vue项目4.4 Vue开发4.4 Vue工程运行流程 1 Vue是什么 Vue是一款Web前端JavaScript 框架&#xff1b; 官网&#xff1a;http…

Redis安装和Python练习(Windows11 + Python3.X + Pycharm社区版)

环境 Windows11 Python3.X Pycharm社区版 思路 1 github下载redis压缩包 &#xff0c;安装并启动redis服务&#xff0c;在客户端连接redis服务。 2 在pycharm中运行python程序&#xff0c;连接redis服务&#xff0c;熟悉redis的使用和巩固python语言。 3 python开发环境…