【MySQL】表的约束{ 常见约束 空属性 默认值 列描述comment zerofill 主键 复合主键 自增长 唯一键 外键 }

news2024/9/9 5:10:26

文章目录

  • 常见约束
    • 空属性
    • 默认值
    • 列描述comment
    • zerofill
    • 主键
    • 复合主键
    • 自增长
    • 唯一键
    • 外键
  • 2.总结

真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。

表的约束很多,这里主要介绍如下几个:

null/not null, default, comment, zerofill, primary key, auto_increment, unique key

常见约束

空属性

两个值:null(默认的)和not null(不为空)
数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

空属性做运算

mysql> select null;
 +------+
 | NULL |
 +------+
 | NULL |
 +------+
 1 row in set (0.00 sec)
mysql> select 1+null;
 +--------+
 | 1+null |
 +--------+
 |   NULL |
 +--------+
 1 row in set (0.00 sec)

创建表时不指定非空 mysql默认可以为空

创建一个班级表,包含班级名和班级所在的教室。站在正常的业务逻辑中:
如果班级没有名字,你不知道你在哪个班级
如果教室名字可以为空,就不知道在哪上课

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

在这里插入图片描述

不插数据 报错:该字段没有默认值/缺省值;插了空数据:报错:该字段不允许为空

在这里插入图片描述

默认值

默认值:某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。默认值的生效:数据在插入的时候不给该字段赋值,就使用默认值。

mysql> insert into tt10(name) values('zhangsan');
 Query OK, 1 row affected (0.00 sec)
mysql> select * from tt10;
 +----------+------+------+
 | name     | age  | sex  |
 +----------+------+------+
 | zhangsan |    0 ||
 +----------+------+------+--注意:只有设置了default的列,才可以在插入值的时候,对列进行省略

列描述comment

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

mysql> create table tt12 (
-> name varchar(20) not null comment '姓名',
-> age tinyint unsigned default 0 comment '年龄',
-> sex char(2) default '男' comment '性别'
-> );--注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空

通过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

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。通过show看看tt3表的建表语句:

mysql> show create table tt3\G
 ***************** 1. row *****************
 Table: tt3
 Create Table: CREATE TABLE `tt3` (
 `a` int(10) unsigned DEFAULT NULL,
 `b` int(10) unsigned DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=gbk
 1 row in set (0.00 sec)
可以看到int(10),这个代表什么意思呢?整型不是4字节码?这个10又代表什么呢?其实没有zerofill这个属性,括号内的数字是毫无意义的。a和b列就是前面插入的数据,如下:
mysql> insert into tt3 values(1,2);
 Query OK, 1 row affected (0.00 sec)
 mysql> select * from tt3;
 +------+------+
 | a    | b    |
 +------+------+
 |    
1 |    2 |
 +------+------+
但是对列添加了zerofill属性后,显示的结果就有所不同了。修改tt3表的属性:
mysql> alter table tt3 change a int(5) unsigned zerofill;
mysql> show create table tt3\G
 *************************** 1. row ***************************
 Table: tt3
 Create Table: CREATE TABLE `tt3` (
 `a` int(5) unsigned zerofill DEFAULT NULL,  --具有了zerofill
 `b` int(10) unsigned DEFAULT NULL
 ) ENGINE=MyISAM DEFAULT CHARSET=gbk
 1 row in set (0.00 sec)
对a列添加了zerofill属性,再进行查找,返回如下结果:
mysql> select * from tt3;
 +-------+------+
 | a     | b    |
 +-------+------+
 | 00001 |    2 |
 +-------+------+
这次可以看到a的值由原来的1变成00001,这就是zerofill属性的作用,如果宽度小于设定的宽度(这里设置的是5),自动填充0。要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。为什么是这样呢?我们可以用hex函数来证明。
mysql> select a, hex(a) from tt3;
 +-------+--------+
 | a     | hex(a) |
 +-------+--------+
 | 00001 | 1      |
 +-------+--------+
可以看出数据库内部存储的还是1,00001只是设置了zerofill属性后的一种格式化输出而已

实操演示

在这里插入图片描述
在这里插入图片描述

hex()函数

在这里插入图片描述

在这里插入图片描述

主键

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

主键约束:主键对应的字段中不能重复,一旦重复,操作失败

在这里插入图片描述

删除主键:alter table 表名 drop primary key;

在这里插入图片描述

当表创建好以后但是没有主键的时候,可以再次追加主键 alter table 表名 add primary key(字段列表)

在这里插入图片描述
在这里插入图片描述

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。
在这里插入图片描述

主键冲突

在这里插入图片描述

自增长

auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。

自增长的特点:

任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
自增长字段必须是整数
一张表最多只能有一个自增长

在这里插入图片描述

不插id 自动插入了!

在这里插入图片描述

,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

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

mysql > select last_insert_id();
 +------------------+
 | last_insert_id() |
 +------------------+
 |              502 |
 +------------------+

唯一键

一张表中往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。

关于唯一键和主键的区别:

主键:可以唯一标识一条记录。
唯一键更多的是保证在业务上,不要和别的信息出现重复。
比如在公司,我们需要一个员工管理系统,系统中有一个员工表,员工表中有两列信息,一个身份证号码,一
个是员工工号,我们可以选择身份号码作为主键。设计员工工号的时候,需要一种约束:所有的员工工号都不能重复。在公司的业务上不能重复,我们设计表的时候,需要这个约束,那么就可以将员工工号设计成为唯
一键。
一般而言,我们建议将主键设计成为和当前业务无关的字段,当业务调整的时候,我们可以尽量不会对主键做过大的调整。

唯一键插入不能重复

在这里插入图片描述

唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。

在这里插入图片描述

外键

外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束或unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null。foreign key (字段名) references 主表(列)
在这里插入图片描述
如果将班级表中的数据都设计在每个学生表的后面,那就会出现数据几余,所以我们只要设计成让stu->classid和myclass->id形成关联的关系。

先创建主键表

create table myclass (
 id int primary key,
 name varchar(30) not null comment'班级名'
 );

再创建从表

create table stu (
 id int primary key,
 name varchar(30) not null comment '学生名',
 class_id int,
 foreign key (class_id) references myclass(id)
 ); 

正常插入数据

mysql> insert into myclass values(10, 'C++大牛班'), (20, 'java大神班');
 Query OK, 2 rows affected (0.03 sec)
 Records: 2  Duplicates: 0  Warnings: 0
 
mysql> insert into stu values(100, '张三', 10),(101, '李四',20);
 Query OK, 2 rows affected (0.01 sec)
 Records: 2  Duplicates: 0  Warnings: 0

插入一个班级号为30的学生,因为没有这个班级,所以插入不成功

mysql>insert into stu values(102,'wangwu',30);
ERROR 1452(23000):Cannot addor update a child row:
a foreign key constraint fails(mytest.stu, CONSTRAINT stu_ibfk_1FOREIGN KEY(cassid)REFERENCES myclass(id))

插入班级id为nul,比如来了一个学生,目前还没有分配班级

mysql>insert into stu values(102,'wangwu', nu11);

这个世界是数据很多都是相关性的。上面的例子我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。

在实际使用的时候,可能会出现什么问题?

有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?因为此时两张表在业务上是有相关性的,但是在业务上没有建立约束关系,那么就可能出现问题。

解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

2.总结

表的约束:表中一定要有各种约束,通过约束,让我们未来插入数据库表中的数据是符合预期的。
约束本质是通过技术手段,倒逼用户,插入正确的数据。反过来,在 mysql 角度,凡是插入进来的数据,都是符合数据约束的!约束的最终目的就是保证数据的完整性和可预期性。因此我们需要更多的约束条件!

not null 和 default 可以同时出现,它们并不冲突,而是相互补充的。当用户忽略了这一列的时候,如果设置了 default,就是用默认值,如果没有设置,就直接报错,因为有 not null 约束。但是 not null 和 defalut 一般不需要同时出现,因为 default 本身有默认值,不会为空。

一张表中最多只有一个主键,不意味着一个表的主键,只能添加给一列!一个主键可以被添加到一列,或者多列上,这种叫做复合主键。在创建表的时候,在所有字段之后,使用 primary key (主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

外键:

  1. 从表和主表的关联关系
  2. 产生外键约束
    外键之名(关联关系),外键之实(约束)
  3. 关联
  4. 约束

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

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

相关文章

MySQL基础练习题12-使用唯一标识码替换员工ID

题目:展示每位用户的 唯一标识码(unique ID );如果某位员工没有唯一标识码,使用 null 填充即可。 准备数据 分析数据 题目:展示每位用户的 唯一标识码(unique ID );如果…

一, 创建工程,引入依赖

一, 创建工程,引入依赖 文章目录 一, 创建工程,引入依赖创建工程工程间的关系的建立配置各个工程当中的 pow 配置信息,相关的依赖父工程(也就是总项目工程)的 pow 配置demo-module06-generate 模块中pow 配置&#xff…

基于IEC61499标准的在线工业编程平台open61499

基于IEC61499标准的在线工业编程平台open61499是一个专为工业自动化领域设计的编程环境,它遵循IEC 61499标准,为开发者提供了一种高效、灵活的方式来创建、配置和管理分布式控制系统(DCS)的应用程序。以下是对open61499的详细解析…

LeetCode热题 翻转二叉树、二叉树最大深度、二叉树中序遍历

目录 一、翻转二叉树 1.1 题目链接 1.2 题目描述 1.3 解题思路 二、二叉树最大深度 2.1 题目链接 2.2 题目描述 2.3 解题思路 三、二叉树中序遍历 3.1 题目链接 3.2 题目描述 3.3 解题思路 一、翻转二叉树 1.1 题目链接 翻转二叉树 1.2 题目描述 1.3 解题思路 根…

【多模态大模型】 BLIP in ICML 2022

一、引言 论文: BLIP: Bootstrapping Language-Image Pre-training for Unified Vision-Language Understanding and Generation 作者: Salesforce Research 代码: BLIP 特点: 该方法分别使用ViT和BERT进行图像和文本特征提取&am…

【changchain-community安装失败】‘EntryPoints‘ object has no attribute ‘get‘报错解决

在安装changchain-community时报错信息如下: WARNING: Keyring is skipped due to an exception: EntryPoints object has no attribute get ERROR: Could not find a version that satisfies the requirement changchain-community ERROR: No matching distributio…

进程间通信与线程间通信的方法汇总

目录 一、进程间通信机制 管道(pipe): 命名管道(FIFO): 消息队列(MQ): 信号量(semaphore): 共享内存(shared memory): 信号(signal): 内存映射(mapped memory): 内存映射和共享内存的区…

华杉研发九学习日记20 LinkedHashMap TreeMap Arrays 函数式接口 方法引用

华杉研发九学习日记20 一&#xff0c;LinkedHashMap 与HashMap相比&#xff0c;key是有序的 Map<Integer,String> map new LinkedHashMap<Integer,String>(); map.put(1, "one"); map.put(2, "two"); map.put(3, "three"); map.…

GitHub Desktop commit文件到repository

1. Clone a repository到本地 2. 在本地仓库修改/添加需要提交的文件或者文档 3. 添加comments并commit 4. 提交完成&#xff0c;点击Push origin提交代码到Github远程仓库 上传成功后&#xff0c;刷新Github网站页面就会出现上传的项目

鸿蒙应用框架开发【自绘编辑框】 输入法框架

自绘编辑框 介绍 本示例通过输入法框架实现自会编辑框&#xff0c;可以绑定输入法应用&#xff0c;从输入法应用输入内容&#xff0c;显示和隐藏输入法。 效果预览 使用说明 1.点击编辑框可以绑定并拉起输入法&#xff0c;可以从输入法键盘输入内容到编辑框。 2.可以点击a…

SSM老人服务管理系统小程序-计算机毕业设计源码91022

摘 要 21世纪的今天&#xff0c;随着社会的不断发展与进步&#xff0c;人们对于信息科学化的认识&#xff0c;已由低层次向高层次发展&#xff0c;由原来的感性认识向理性认识提高&#xff0c;管理工作的重要性已逐渐被人们所认识&#xff0c;科学化的管理&#xff0c;使信息存…

跨网段 IP 地址通信故障分析

现如今计算机网络的规模和复杂性不断增加&#xff0c;跨网段通信成为网络运行中的常见需求。但如果设备处于不同网段且路由设置出现偏差时就会导致通信故障&#xff0c;严重影响网络的正常运行和数据传输。 1.跨网段通信的基本原理 跨网段通信依赖于路由器的路由功能。路由器根…

vue3.0 入门基础知识汇总【1】 全面 精简 推荐

这篇博文主要对一些刚入门vue框架的同学&#xff0c;以及对vue基本知识进行巩固的&#xff0c;最后就是精简一下基本知识&#xff0c;以方便自己查看&#xff0c;感谢参考&#xff0c;有问题评论区交流&#xff0c;谢谢。 目录 1.component组件的基本结构和使用 2.method方法…

全网最适合入门的面向对象编程教程:28 类和对象的Python实现-Python编程原则、哲学和规范大汇总

全网最适合入门的面向对象编程教程&#xff1a;28 类和对象的 Python 实现-Python 编程原则、哲学和规范大汇总 摘要&#xff1a; 本文主要介绍了在使用 Python 进行面向对象编程时&#xff0c;Python 异常处理的原则-“请求谅解&#xff0c;而非许可”&#xff0c;以及软件设…

什么是安全编程?

安全编程&#xff08;Secure Programming&#xff09;是一种编程方法论&#xff0c;旨在通过编写安全可靠的代码来保护计算机系统和数据的安全性。它涵盖了软件设计、开发、测试和维护的整个生命周期&#xff0c;旨在最大程度地降低软件漏洞和安全缺陷的风险。以下是对安全编程…

【前端 20】Element-UI快速入门

探索Element UI组件库&#xff1a;快速搭建Vue应用的必备工具 在现代Web开发中&#xff0c;Vue.js以其轻量级和灵活性赢得了广泛的关注。而Element UI&#xff0c;作为Vue.js的一个UI组件库&#xff0c;更是为开发者们提供了丰富、易用的前端组件&#xff0c;极大地加速了开发过…

Spring源码(八)--Spring实例化的策略

Spring实例化的策略有几种 &#xff0c;可以看一下 InstantiationStrategy 相关的类。 UML 结构图 InstantiationStrategy的实现类有 SimpleInstantiationStrategy。 CglibSubclassingInstantiationStrategy 又继承了SimpleInstantiationStrategy。 InstantiationStrategy I…

Java----反射

什么是反射&#xff1f; 反射就是允许对成员变量、成员方法和构造方法的信息进行编程访问。换句话来讲&#xff0c;就是通过反射&#xff0c;我们可以在不需要创建其对象的情况下就可以获取其定义的各种属性值以及方法。常见的应用就是IDEA中的提示功能&#xff0c;当我…

摆弄it:越走越深

在英语中&#xff0c;it是一个单词&#xff0c;就是“它”&#xff0c;这是众所周知的事情。今天&#xff0c;我们就来摆弄一下it&#xff0c;摆弄一下“它”&#xff0c;看看能摆弄出什么名堂来。 一、它是它自己 it 大家都知道&#xff0c;同样&#xff0c;itself&#xff0…

大模型算法面试题(十七)

本系列收纳各种大模型面试题及答案。 1、LoRA权重是否可以合入原模型 LoRA权重可以合入原模型。LoRA&#xff08;Low-Rank Adaptation of Large Language Models&#xff09;是一种用于微调大型语言模型的低秩适应技术。它通过训练低秩矩阵&#xff0c;并将这些参数注入到原始…