MySQL | 表的约束

目录

1. 空属性 NULL

2. 默认值 DEFAULT

3. 列描述comment

4. zerofill

5. 主键 PRIMARY KEY

6. 自增长AUTO_INCREMENT

7. 唯一键UNIQUE

8. 外键


真正约束字段的是数据类型,但是数据类型约束很单一,需要有一些额外的约束,更好的保证数据的合法性,从业务逻辑角度保证数据的正确性。比如有一个字段是email,要求是唯一的。
表的约束很多,这里主要介绍如下几个: null/not null,default, comment, zerofill,primary key,
auto_increment,unique key 。

1. 空属性 NULL

两个值:null 和 not null -> 为空或不为空

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

create table student (
    name varchar(20) not null,
    class varchar(10) not null
);

如果设置为null,那么在插入数据的时候,必须有数据插入。

2. 默认值 DEFAULT

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

比如:在女子学院里面,可以将性别这一个属性默认设置为女。

create table test_default (
    name varchar(20) default '张三'
); // 创建一个表

insert into test_default values(); // 插入数据,但是不指定任何值

select * from test_default; // 查询表中的数据

默认值的生效,数据插入的时候不给该字段赋值,就使用默认值。

insert into test_default values('lisi');

select * from test_default

只有设置了default的列,才可以在插入值的时候,对列进行省略
--注意:not null和defalut一般不需要同时出现,因为default本身有默认值,不会为空

3. 列描述comment

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

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

通过desc查看不到注释信息。

desc test_comment;

通过show可以看到

show create table test_comment

4. zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。

create table test_zerofill (
    age int(10)
)

show create table test_zerofill;

这里面的int(10)代表什么意思?整形int不应该是4字节吗?这个10代表什么?其实没有zerofill这个属性,括号内的数据时毫无意义的。

现在插入一条数据,

insert into test_zerofill values(5);

select * from test_zerofill;

现在将age列添加上zerofill字段。

alter table test_zerofill change age age int(5) zerofill;
select * from test_zerofill;

这次可以看到5变成了0……5,这就是zerofill属性的作用,如果宽度小于设定的宽度,自动填充0.要注意的是,这只是最后显示的结果,在MySQL中实际存储的还是1。

5. 主键 PRIMARY KEY

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

create table test_primary (
    id int not null primary key,
    name varchar(20) not null
);

desc test_primary;


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

insert into test_primary values(1, 'a'), (1, 'b');


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

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

删除主键

alter table table_name drop primary key;

复合主键

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

create table test_1 (
    id int,
    name varchar(20),
    score tinyint,
    primary key(id, name)
);

desc test_1;

6. 自增长AUTO_INCREMENT

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

自增长的特点:

  1. 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
  2. 自增长字段必须是整数
  3. 一张表最多只能有一个自增长。
create table test_auto (
    id int unsigned primary key auto_increment,
    name varchar (10) not null default ''
);

insert into test_auto(name) values('a');

insert into test_auto(name) values('b');

select * from test_auto;

索引:
在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。
索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。

7. 唯一键UNIQUE

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

唯一键的本质和主键差不多,唯一键允许为空,而且可以多个为空,空子段不做唯一性比较。

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

主键更多的是标识唯一性,唯一键更多的是保证在业务上,不要和别的信息出现重复。

create table test_unique (
    id char(10) unique,
    name varchar(10)
);

插入第一条数据

insert into test_unique values('01', 'a');

插入第二条数据,id的值和第一条数据的id值一样

insert into test_unique values('01', 'b');

插入第三条数据,id值为空

insert into test_unique values('', 'b');

查询

select * from test_unique;

8. 外键

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

foreign key (字段名) references 主表(列)

create table myclass (
    id int primary key,
    name varchar(30) not null
);

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

正常插入数据

insert into myclass values(10, 'C++大牛班'),(20, 'java大神班');

插入一个班级号为15的学生,因为没有这个班级,是不会插入成功的。

insert into stu values(102, 'aa', 15);

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

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

相关文章

VS2019加QT5.14中Please assign a Qt installation in ‘Qt Project Settings‘.问题的解决

第一篇: 原文链接:https://blog.csdn.net/aoxuestudy/article/details/124312629 error:There’ no Qt version assigned to project mdi.vcxproj for configuration release/x64.Please assign a Qt installation in “Qt Project Settings”. 一、分…

AG32 MCU以太网应用实例demo

一. 前言 AGM32系列32位微控制器旨在为MCU用户提供新的自由度和丰富的兼容外设,以及兼容的引脚和功能。AG32F407系列产品具有卓越的品质,稳定性和卓越的价格价值。 AG32产品线支持其所有接口外设尽可能接近主流兼容性,并提供丰富的参考设计…

机器人路径规划:基于深度优先搜索(Depth-First-Search,DFS)算法的机器人路径规划(提供Python代码)

一、深度优先搜索算法介绍 深度优先搜索算法(Depth-First-Search)的基本思想是沿着树的深度遍历树的节点,尽可能深的搜索树的分支。当节点v的所有边都己被探寻过,搜索将回溯到发现节点v的那条边的起始节点。这一过程一直进行到已…

代码学习记录21--回溯算法第二天

随想录日记part21 t i m e : time: time: 2024.03.16 主要内容:今天主要是结合类型的题目加深对回溯算法的理解:1:组合总和;2:电话号码的字母组合 216.组合总和III17.电话号码的字母…

维基百科推广秘诀13个方法助你成为行业领导者-华媒舍

维基百科(Wikipedia)作为全球最大、最权威的在线百科全书,拥有海量的知识内容,被广大用户广泛使用。对于任何一个领域的从业者来说,建立自己的维基百科页面,无疑是提升行业影响力的重要手段。本文将向您介绍…

LEETCODE 100255. 成为 K 特殊字符串需要删除的最少字符数

整体思路: 1.可以看到这道题是要求是最小的,那么可以想到遍历所有情况 2.把题干已知条件转换为一个数组,那么只需要以数组每个元素为开头遍历所有情况即可。 3.对于一个数考虑其后面的情况,其后每个数等于这个数k和数本身的最小值(遍历累计求…

【C语言】指针基础知识(一)

计算机上CPU(中央处理器)在处理数据的时候,需要的数据是在内存中读取的,处理后的数据也会放回内存中。 一,内存和地址 内存被分为一个个单元,一个内存单元的大小是一个字节。 内存单元的编号(可以理解为门…

Ypay源支付2.8.8免授权聚合免签系统

本帖最后由 renleixiaoxu 于 2024-3-15 09:46 编辑 产品介绍 XPay是专为个人站长打造的聚合免签系统,拥有卓越的性能和丰富的功能。采用全新轻量化的界面UI,让您可以更加方便快捷地解决 知识付费和运营赞助的难题。同时,它基于高性能的Thin…

ubuntu安装docker的详细教程

检查卸载老版本docker ubuntu下自带了docker的库,不需要添加新的源。 但是ubuntu自带的docker版本太低,需要先卸载旧的再安装新的。 注:docker的旧版本不一定被称为docker,docker.io 或 docker-engine也有可能,所以卸…

Hypermesh碰撞安全之头部撞击模拟

1、首先到自定义工作面板中选择Engineering Solutions(工程解决方案) 2、进入行人保护建模流程模块 3、导入所需要的模型 4、对模型进行切割,选择所需要保留的区域 5、单击next进入下一界面 6、选择打击类型 下一步进入: 这样就完成了打击点…

基于深度学习的唇语识别系统的设计与实现

概要 人工智能作为三大工程之一,从上个世纪至今仍然活跃于各个行业的研究与应用之中,应时代的热潮方向,本 课题主要针对深度学习技术应用于唇语识别当中,实现词语唇语的翻译功能。唇语识别在图像处理中一直是一个富 有挑战性的课题…

基础知识学习 -- qnx 系统

QNX是一个基于优先级抢占的系统。 这也导致其基本调度算法相对比较简单。因为不需要像别的通用操作系统考虑一些复杂的“公平性”,只需要保证“优先级最高的线程最优先得到 CPU”就可以了。 基本调度算法 调度算法,是基于优先级的。QNX的线程优先级&a…

【LabVIEW FPGA入门】单周期定时循环

单周期定时循环详解 单周期定时环路是FPGA编程中最强大的结构之一。单周期定时循环中的代码更加优化,在FPGA上占用更少的空间,并且比标准While循环中的相同代码执行得更快。单周期定时环路将使能链从环路中移除,以节省FPGA上的空间。…

C++算法学习心得八.动态规划算法(4)

1.零钱兑换(322题) 题目描述: 给定不同面额的硬币 coins 和一个总金额 amount。编写一个函数来计算可以凑成总金额所需的最少的硬币个数。如果没有任何一种硬币组合能组成总金额,返回 -1。 你可以认为每种硬币的数量是无限的。…

QTextToSpeech的使用——Qt

前言 之前随便看了几眼QTextToSpeech的帮助就封装使用了,达到了效果就没再管了,最近需要在上面加功能(变换语速),就写了个小Demo后,发现不对劲了。 出现的问题 场景 写了个队列添加到语音播放子线程中&a…

多线程(代码案例: 单例模式, 阻塞队列, 生产者消费者模型,定时器)

设计模式是什么 类似于棋谱一样的东西 计算机圈子里的大佬为了能让小菜鸡的代码不要写的太差 针对一些典型的场景, 给出了一些典型的解决方案 这样小菜鸡们可以根据这些方案(ACM里面叫板子, 象棋五子棋里叫棋谱, 咱这里叫 设计模式), 略加修改, 这样代码再差也差不到哪里去 … …

官方安装配置要求服务器最低2核4G

官方安装配置要求服务器至少2核、4G。 如果服务器低于这个要求,就没有必要安装,因为用户体验超级差。 对于服务器CPU来说,建议2到4核就完全足够了,太多就浪费了,但是内存越大越好,最好是4G以上。 如果服务器…

数据库 | Mysql - [binlog]

INDEX 1 什么是 binlog2 作用3 数据恢复4 主从复制 1 什么是 binlog Mysql server 的日志文件 自动开启 2 作用 数据恢复主从复制 3 数据恢复 实际场景 01.00:数据全量备份08.00:数据丢失(比如被人误删)09.00:故…

贪心问题题目集一(代码 注解)

目录 介绍: 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 题目八: 介绍: 贪心算法是一种特殊的算法思想,它在每一步选择中都采取…