Mysql表的约束超详细讲解

目录
  • 约束的概念
  • 空属性
  • 默认值
  • 列描述
  • zerofill
  • 主键
  • 自增长
  • 唯一键
  • 外键

约束的概念

约束:通过限制用户操作的方式,来达到维护数据本身安全,完整性的一套方案。

为什么要有约束? Mysql是一套整体的数据存储解决方案,除了解决数据存储功能,还要保证数据的安全,减少用户的误操作。 表的约束有很多,主要介绍:null/not null,default, comment, zerofill,primary key, auto_increment,unique key 。

空属性

数据库默认字段基本都是字段为空,但是实际开发时,尽可能保证字段不为空,因为数据为空没办法参与运算。

空属性有2个值分别为: null(默认)not null(不为空)

例:

实例:

创建一个班级表,包含班级名和班级所在的教室。如果班级没有名字,就不知道学生在哪个班级,如果教室为空,就不知道在哪里上课。所以在设计数据库时要在表中进行限制,满足上面条件的数据就不能插入到表中。这就是约束。

create table myclass(
 class_name varchar(20) not null,
 class_room varchar(10) not null
);

没有给class_room插入数据就报错了。

默认值

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

实例:

数据在插入时不给该字段赋值,就使用默认值。注意:只有设置了default的列,才可以在插入值的时候,对列进行省略

列描述

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

create table tt12 (
name varchar(20) not null comment '姓名',
sex char(2) default '男' comment '性别'
);

desc 表名查不到注释,通过show能看到注释。

zerofill

主键

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

案例:

创建表的时候直接在字段上指定主键

create table tt13 (
id int unsigned primary key comment '学号不能为空',
name varchar(20) not null);

主键对应的字段不能重复,再插入张三就会报错,

删除主键:

alter table 表名 drop primary key;

当表创建好以后但是没有主键的时候,可以再次追加主键

alter table 表名 add primary key(字段列表)

刚刚是删除主键了,再次添加主键。

复合主键:

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

实例:

create table tt14(
id int unsigned,
course char(10) comment '课程代码',
score tinyint unsigned default 60 comment '成绩',
primary key(id, course) -- id和course为复合主键 -> );

也会出现主键冲突。

自增长

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

id会自动增长。

它就会从字段中最大值+1.

自增长特点:

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

唯一键

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

唯一键和主键的区别:

  • 唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空字段不做唯一性比较。
  • 主键更多的是标识唯一性的。而唯一键更多的是保证在业务上,不要和别的信息出现重复。

实例:

在公司中,需要一个员工管理系统,员工表中有2条信息,一个是身份证,一个是员工号,选择身份证作为主键,设计员工工号时不能有重复的,所以需要唯一键。注意:一般建议把主键设计成和当前的业务无关的字段,当需要调整业务时,不需要对主键做大的调整。

create table student (
id char(10) unique comment '学号,不能重复,但可以为空',
name varchar(10)
 );

唯一键不能重复,但是可以为空。

外键

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

主表

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)
);

正常插入数据:

插入一个班级30的学生

就会报错。

结论:

理论上,上面的例子,我们不创建外键约束,就正常建立学生表,以及班级表,该有的字段我们都有。 此时,在实际使用的时候,可能会出现什么问题? 有没有可能插入的学生信息中有具体的班级,但是该班级却没有在班级表中?出现了103的班级,解决方案就是通过外键完成的。建立外键的本质其实就是把相关性交给mysql去审核了,提前告诉mysql表之间的约束关 系,那么当用户插入不符合业务逻辑的数据的时候,mysql不允许你插入。

到此这篇关于Mysql表的约束超详细讲解的文章就介绍到这了,更多相关Mysql表的约束内容请搜索我们以前的文章或继续浏览下面的相关文章希望大家以后多多支持我们!

(0)

相关推荐

  • MySQL使用表锁和行锁的场景详解

    目录 前言 全局锁 表级锁 表锁 元数据锁 意向锁 行级锁 总结 前言 MySQL Innodb 的锁可以说是执行引擎的并发基础了,有了锁才能保证数据的一致性.众所周知,我们都知道 Innodb 有全局锁.表级锁.行级锁三种,但你知道什么时候会用表锁,什么时候会用行锁吗? 虽然对 MySQL 的知识点挺熟悉的,但一开始看到这个问题,树哥也是有点懵,我还真没从这个角度去思考过.大家可以暂时 1 分钟思考下答案,后面我将带大家弄清楚这个问题. 对于这个问题,我只能粗略地想起一些片段,例如: 对于表级

  • MySql超详细讲解表的用法

    目录 1. 建表的语法 2. mysql中的数据类型 3. 模拟表 4. 创建一个学生表 1. 创建表(create-DDL) 2. 插入数据(insert-DML) 3. 插入日期 4. date和datetime的区别 5. 更新(update-DML) 6. 删除(delete-DML) 5. 快速创建表(复制表) 6. 快速删除表中数据 1. 建表的语法 建表属于 DDL 语句,DDL 语句包括:create.drop.alter… create table 表名(字段1 数据类型, 字

  • Mysql表连接的执行流程详解

    目录 1. 前言 1.1 mysql连接的原理 1.2 show warnings命令 2. 准备工作 3. inner join内连接on.where的区别 4. left join左连接on.where的区别 4.1 where驱动表过滤条件 4.2 on驱动表过滤条件 4.3 on被驱动表过滤条件 4.4 where被驱动表过滤条件 5. 总结 1. 前言 对于连接操作,驱动表和被驱动表的关联条件我们放在on后面,如果额外增加对驱动表和被驱动表的过滤条件,放到on或者where后面都不会报

  • MySQL数据库线上修改表结构的方法

    目录 一.MDL元数据锁 1.什么是MDL锁 2.MDL锁的问题 二.如何线上修改MySQL表结构 一.MDL元数据锁 在修改表结构之前,先来看下可能存在的问题. 1.什么是MDL锁 MySQL有一个把锁,叫做MDL元数据锁,当对表修改的时候,会自动给表加上这把锁,也就是不需要自己显式使用. 当对表做增删改查的时候,加的是MDL读锁 当对表结构做变更修改的时候,加的是MDL写锁 读与读之间不互斥,读与写,写与写之间互斥,因此 当有一个线程对表执行增删盖茶的时候,会阻塞掉别的线程对表结构修改的请求

  • MYsql库与表的管理及视图介绍

    目录 库的管理 1.库的管理 2.表的管理 3.表的修改 表操作的练习题 视图 视图的作用 应用场景 创建视图的语法 库的管理 1.库的管理 创建.修改.删除 1.库的创建 CREATE DATABASE UF NOT EXISTS books: 2.库的修改 库名一般不修改,不安全. 更改库的字符集 ALTER DATABASE books CHARACTER SET gbk; 3,删除 DROP DATABASE books; 2.表的管理 创建(create).修改(alter).删除(d

  • Mysql表的操作方法详细介绍

    目录 创建表 查看表结构 修改表 删除表 创建表 语法: CREATE TABLE table_name ( field1 datatype, field2 datatype, field3 datatype ) character set 字符集 collate 校验规则 engine 存储引擎; 说明: field 表示列名 datatype 表示列的类型 character set 字符集,如果没有指定字符集,则以所在数据库的字符集为准 collate 校验规则,如果没有指定校验规则,则以

  • Mysql表的约束超详细讲解

    目录 约束的概念 空属性 默认值 列描述 zerofill 主键 自增长 唯一键 外键 约束的概念 约束:通过限制用户操作的方式,来达到维护数据本身安全,完整性的一套方案. 为什么要有约束? Mysql是一套整体的数据存储解决方案,除了解决数据存储功能,还要保证数据的安全,减少用户的误操作. 表的约束有很多,主要介绍:null/not null,default, comment, zerofill,primary key, auto_increment,unique key . 空属性 数据库默

  • Mysql超详细讲解死锁问题的理解

    目录 1.什么是死锁? 2.Mysql出现死锁的必要条件 资源独占条件 请求和保持条件 不剥夺条件 相互获取锁条件 3. Mysql经典死锁案例 3.1 建表语句 3.2 初始化相关数据 3.3 正常转账过程 3.4 死锁转账过程 3.5 死锁导致的问题 4.如何解决死锁问题? 4.1 打破请求和保持条件 4.2 打破相互获取锁条件(推荐) 5.总结 1.什么是死锁? 死锁指的是在两个或两个以上不同的进程或线程中,由于存在共同资源的竞争或进程(或线程)间的通讯而导致各个线程间相互挂起等待,如果没

  • MySql约束超详细介绍

    目录 1. 什么是约束 2. 约束包括哪些 3. 非空约束 4. 唯一性约束 1. 单字段唯一性约束 2. 多字段唯一性约束 5. 主键约束 1. 主键约束的相关术语 2. 什么是主键以及有啥用 3. 单一主键 4. 复合主键 5. 其他主键 6. 外键约束 1. 外键约束的相关术语 2. 外键出现的原因 3. 创建外键表 1. 什么是约束 约束对应的英语单词:constraint 在创建表的时候,我们可以给表中的字段加上一些约束,来保证表中的数据的完整性.有效性!!! 约束的作用就是为了保证:

  • C++ 数据结构超详细讲解顺序表

    目录 前言 一.顺序表是什么 概念及结构 二.顺序表的实现 顺序表的缺点 几道练手题 总结 (●’◡’●) 前言 线性表是n个具有相同特性的数据元素的有限序列.线性表是一种在实际中广泛使用的数据结构,常见的线性表:顺序表.链表.栈.队列.字符串. 线性表在逻辑上是线性结构,也就是说连续的一条直线,但是在物理结构并不一定是连续的,线性表在物理上存储时,通常以数组和链式结构的形式存储. 本章我们来深度初体验顺序表 一.顺序表是什么 概念及结构 顺序表是一段物理地址连续的存储单元依次存储数据元素的线性

  • Java 垃圾回收超详细讲解记忆集和卡表

    目录 那么如何才能解决跨代引用呢? 记忆集 卡表 在说记忆集和卡表之前,先给大家介绍一下跨代引用的问题. 假如要现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代的实例对象1在老年代中被引用,为了找出该区域(新生代)中所有的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样.遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担. 事实上并不只是新生代.老年代之间才有跨代引用的问题,

  • Java 垃圾回收超详细讲解记忆集和卡表

    目录 跨代引用 解决跨代引用 记忆集 卡表 跨代引用 在说记忆集和卡表之前,先给大家介绍一下跨代引用的问题. 假如要现在进行一次只局限于新生代区域内的收集(Minor GC),但新生代的实例对象1在老年代中被引用,为了找出该区域(新生代)中所有的存活对象,不得不在固定的GC Roots之外,再额外遍历整个老年代中所有对象来确保可达性分析结果的正确性,反过来也是一样.遍历整个老年代所有对象的方案虽然理论上可行,但无疑会为内存回收带来很大的性能负担. 事实上并不只是新生代.老年代之间才有跨代引用的问

  • C语言超详细讲解顺序表的各种操作

    目录 顺序表是什么 顺序表的结构体 顺序表的接口函数 顺序表相关操作的菜单 顺序表的初始化 添加元素 陈列元素 往最后加元素 往前面加元素 任意位置加元素 删除最后元素 删除前面元素 删除任意元素 整体代码(fun.h部分) 整体代码(fun.cpp部分) 整体代码(主函数部分) 结果展示 顺序表是什么 顺序表是在计算机内存中以数组的形式保存的线性表,线性表的顺序存储是指用一组地址连续的存储单元依次存储线性表中的各个元素.使得线性表中在逻辑结构上相邻的数据元素存储在相邻的物理存储单元中,即通过数

  • C语言超详细讲解数据结构中的线性表

    目录 前言 一.分文件编写 1.分文件编写概念 2.代码展示 二.动态分布内存malloc 1.初识malloc 2.使用方法 三.创建链表并进行增删操作 1.初始化链表 2.在链表中增加数据 3.删除链表中指定位置数据 四.代码展示与运行效果 1.代码展示 2.运行效果 总结 前言 计算机专业都逃不了数据结构这门课,而这门课无疑比较难理解,所以结合我所学知识,我准备对顺序表做一个详细的解答,为了避免代码过长,采用分文件编写的形式,不仅可以让代码干净利落还能提高代码可读性,先解释部分代码的含义,

  • Java超详细讲解ArrayList与顺序表的用法

    目录 简要介绍 Arraylist容器类的使用 Arraylist容器类的构造 ArrayList的常见方法 ArrayList的遍历 ArrayList中的扩容机制 简要介绍 顺序表是一段物理地址连续的储存空间,一般情况下用数组储存,并在数组上完成增删查改.而在java中我们有ArrayList这个容器类封装了顺序表的方法. 在集合框架中,ArrayList是一个普通的类,其实现了list接口.其源码类定义如图 可见,其实现了RandomAccess, Cloneable, 以及Seriali

随机推荐