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

【MySQL】--- 表的约束

【MySQL】--- 表的约束

  • 一、空属性
  • 二、默认值
  • 三、列描述(注释)
  • 四、零填充
  • 五、主键(唯一&&不能为空)
  • 六、复合主键
  • 七、自增长
  • 八、唯一键
  • 九、外键

表的约束实际上就是,对表操作的时候,一种规范,一种制度

一、空属性

空属于用于限制值是否允许为空,默认值为null表示允许为空not null表示不允许为空。虽然默认可以为空,但由于一些字段要参与运算,而空无法被计算,所以要尽可能保证不为空。

示例:

mysql> create table t1(-> id int not null,-> name varchar(20) not null,-> other int );

在这里插入图片描述
此时这个表结构:“是否可以为空” 的那一列属性,前两个就是no,意思该属性不能为空!
other 是默认 没有设置 not NULL ,默认就是可以为空!

如果向 前两个属性 进行 NULL插入操作,就会报错!
在这里插入图片描述

发生报错,not null的列值不可以为空。

二、默认值

在插入数据时,如果某些列没有指定数据,那么就会启用默认值(缺省值)。默认值通过default来指定。

示例:

mysql> create table t2 (-> name varchar(20) not NULL,-> age int unsigned default 18,-> gender varchar(5) default '男');

在这里插入图片描述
如果再次向表里面只插入 name ,其他的 看看能不能 用默认值!

在这里插入图片描述
此时agegender就自动设置为了默认值。

值得注意的是,name列设置了not null属性,但是其default为NULL。如果你不插入name列,此时启用默认值NULL,但是由于该列有not null属性,最后就会报错。

三、列描述(注释)

列描述相当于代码中的注释,用于描述一个列的作用。

列描述通过comment关键字来指定。

示例:

create table t3(
name varchar(20) not null comment '用户名',
age tinyint unsigned default 18 comment '年龄',
gender char(1) default '男' comment '性别'
);

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

其中\G用于更加美观地输出数据。可以看到每一列后面都可以看到对应的列描述,后续的程序员就知道每一列要插入什么样的数据了。

四、零填充

零填充用于控制数据显示的格式,当数据位数不足时,自动在前面补0。零填充通过zerofill关键字来指定。

create table t4(
a int,
b int(5),
c int(5) zerofill
);

通过desc查看表的属性:

在这里插入图片描述

  1. 在Type列中,int后面()内的数字,用于指定数据的显示宽度,在没有zerofill属性时,该数字无意义。
  2. 注意该值不影响任何数据的真实存储范围,存储范围由unsigned以及int,tinyint等类型本身的属性来决定。
  3. 显示宽度要配合zerofill使用才有意义
  4. c的类型是int(5),但是最后却多出了unsigned。在指定zerofill属性时,会自动给整型添加unsigned属性。如果数字显示时位数不足5位,就会自动填充到5位。

在这里插入图片描述

  • 第一次插入了1, 2, 3,前两个列没有zerofill,只显示单个数字,由于c有zerofill,最后输出了00003。
  • 第二次插入了1234567,超出了5位,但是显示时没有截断说明()内的数字,不会影响数据的显示

在这里插入图片描述

五、主键(唯一&&不能为空)

主键用于约束每一行数据之间的唯一性,被指定为主键的列不允许重复不能为空,且一张表只能有一个主键。
建表时,通过primary key来指定主键。

create table t5(
id int unsigned primary key,
name varchar(20)
);

通过desc查看表的属性:

在这里插入图片描述
id被指定为了主键,其Key的值位PRI表示这是主键,被设置主键的同时,自动增加了not null属性

主键不允许重复:示例:
在这里插入图片描述
上图中,第一次id = 1,第二次插入另外一条数据时id = 1,此时发生报错,因为主键不允许重复。

  • 当创建好表后如果没有主键,可以追加主键
alter table 表名 add primary key(列名);
  • 删除主键:
alter table 表名 drop primary key;

示例:

在这里插入图片描述
上图中,先删除了t5的主键,随后(1, ‘张三’)就可以正常插入了,可以证明主键约束确实不存在了。

当想要再添加回主键属性时,由于id列有两个相同的值,此时id不允许作为主键了。此时只有修改某个id的值使之不重复,才能重新设置主键了。

六、复合主键

建表时,可以让多个列共同成为一个主键,这种主键叫做复合主键

通过primary key (列1, 列2 …)来指定复合主键。

create table t6(
id_1 int unsigned,
id_2 int unsigned,
name varchar(20),
primary key (id_1, id_2)
);

通过desc查看表的属性:

在这里插入图片描述

复合主键整体 冲突 才算冲突!

在这里插入图片描述

七、自增长

被设置为自增长的列,如果插入数据时没有指定值,那么会根据当前列中的最大值+1进行插入。

自增长要求:

  1. 任何一个字段想要自增长,前提是该列本身是一个索引(Key栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只有一个自增长

通过auto_increment来设置自增长。

示例:
如果你尚不了解索引,那么可以直接对主键设置auto_increment,主键列自带索引

create table t7(
id int unsigned primary key auto_increment,
name varchar(20) not null
);

通过desc查看表的属性:
在这里插入图片描述

其中id列被设为了主键,Key的值为PRI,该列有值说明是索引,因此可以添加auto_increment属性,在Extra中可以看到id具有该属性。

在这里插入图片描述

插入6个张三后,发现明明没有指定id,但是id列还是有值,而且自己从1开始增长了。

再尝试插入其他值:

展示 会根据当前列中的最大值+1进行插入
在这里插入图片描述
其实自增长是依靠一个变量auto_increment来计算的,该 变量可以在建表时直接指定


这次自增长就从50开始了。

八、唯一键

表中往往有很多字段都需要唯一性,主键只有一个,不可能所有字段都通过主键来保证唯一性,此时就需要唯一键

主键与唯一键的区别:唯一键可以为空!!!

唯一键通过unique key或unique关键字指定,后面的key省略。

create table t9(
id int unsigned unique,
name varchar(10) 
);

通过desc查看表的属性:
在这里插入图片描述
id列的Key属性为UNI,即唯一键。

尝试插入数据:

唯一键 冲突:

在这里插入图片描述

但是插入多条数据id为空是合法的,因为唯一键不对空进行重复性比较。
在这里插入图片描述

九、外键

在数据库中,往往不只有一张表,而多张表之间往往是有从属关系的。

比如说一个学生属于一个班级,假设有一个学生表,一个班级表。如果只有1,2,3,4四个班级,那么某一个学生就不可能属于五班。这就是班级对学生的约束,从数据库的角度来看就是:学生表的班级字段,必须在班级表中存在。想要实现这个功能,就需要外键。

在这里插入图片描述
左侧是学生表,右侧是班级表。学生表中class被指定为外键,受到班级表中id的限制,班级表中id列叫做参照键。

因为学生从属于班级,所以班级表是主表学生表是从表外键在从表中参照键在主表中。外键受到参照键影响:

  1. 外键的值必须在参照键中存
  2. 外键的值允许为空

建表时,设置外键的语法为:

foreign key(外键) references 主表(参照键)

另外的,参照键必须具有唯一性,一般为主键或者唯一键。

示例:

主表 - 班级表:

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

从表 - 学生表:

create table student(
id int unsigned primary key,
name varchar(32) not null,
tel varchar(32) not null,
class_id int,
foreign key(class_id) references class(id)
);

建立学生表时,foreign key(class_id) references class(id)就建立了外键,对应的参照键为class表的id。

通过desc查看表的属性:

在这里插入图片描述
外键class_id的Key属性为MUL,表示外键。

class的内容如下:
在这里插入图片描述

尝试对学生表插入数据:

在这里插入图片描述
另外的,外键其实也会反过来约束参照键!


文章转载自:

http://QHC91yli.gnhsg.cn
http://S70MHKOm.gnhsg.cn
http://2BvvwK0b.gnhsg.cn
http://iW0GELmF.gnhsg.cn
http://8UpqYPyH.gnhsg.cn
http://Vp9yNV8q.gnhsg.cn
http://IbBVFIrS.gnhsg.cn
http://cAWYEign.gnhsg.cn
http://AEchOmBM.gnhsg.cn
http://iP4Cw97k.gnhsg.cn
http://pAoAhiYz.gnhsg.cn
http://X3LGhBMA.gnhsg.cn
http://uJzVok09.gnhsg.cn
http://G7t7wzjn.gnhsg.cn
http://yZoIN5Xx.gnhsg.cn
http://kvupLXN5.gnhsg.cn
http://1AxJ4JoK.gnhsg.cn
http://NVEJxh2a.gnhsg.cn
http://H5l6wQob.gnhsg.cn
http://eVxVH4gU.gnhsg.cn
http://zDcoeuZ6.gnhsg.cn
http://XEhBkuuN.gnhsg.cn
http://v3ZZKq9t.gnhsg.cn
http://YYxgEwmE.gnhsg.cn
http://wfchMiYr.gnhsg.cn
http://YRB4pTb9.gnhsg.cn
http://NbrW0VT0.gnhsg.cn
http://4Jyp8tic.gnhsg.cn
http://AJgpi7PD.gnhsg.cn
http://WEBR7H7e.gnhsg.cn
http://www.dtcms.com/a/382000.html

相关文章:

  • SpringBoot 轻量级一站式日志可视化与JVM监控
  • Java零基础学习Day10——面向对象高级
  • JavaScript中ES模块语法详解与示例
  • 系统核心解析:深入操作系统内部机制——进程管理与控制指南(三)【进程优先级/切换/调度】
  • Roo Code:用自然语言编程的VS Code扩展
  • 第8.4节:awk的内置时间处理函数
  • leetcode算法刷题的第三十四天
  • 【技术博客分享】LLM推理过程中的不确定问题
  • Vue3基础知识-setup()、ref()和reactive()
  • 规则系统架构风格
  • 宋红康 JVM 笔记 Day17|垃圾回收器
  • vue表单弹窗最大化无法渲染复杂组件内容
  • 加餐加餐!烧烤斗破苍穹
  • SCSS 中的Mixins 和 Includes,%是什么意思
  • RFID基础了解 --- RC522
  • 第九篇 永磁同步电机控制-弱磁控制
  • 搭建langchain4j+SpringBoot的Ai项目
  • 一次 Linux 高负载 (Load) 异常问题排查实录
  • 扩散模型进化史
  • 学习Python是一个循序渐进的过程,结合系统学习、持续实践和项目驱动,
  • EKSPod 资源利用率配置修复:从占位符到完整资源分析系统
  • MySql基础:数据类型
  • 鸿蒙中的智能设备数据分析实战:从采集到建模的完整实现指南
  • Scikit-Learn 对糖尿病数据集(回归任务)进行全面分析
  • Scikit-learn 对加州房价数据集(回归任务)进行全面分析
  • Scintil在集成光子学技术方面筹集了5800万美元。
  • 通俗易懂地讲解JAVA的BIO、NIO、AIO
  • 数据结构与算法2:线性表补充
  • 内核实时监控策略针对海外vps容器性能的诊断方法
  • Grub2调整启动顺序