MySQL | 表的约束

news2025/1/13 15:49:42

目录

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

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

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

相关文章

P1881 绳子对折

题目描述 FJ 有一个长度为 L(1≤L≤10,000)的绳子。这个绳子上有 N(1≤N≤100)个结,包括两个端点。FJ 想将绳子对折,并使较短一边的绳子上的结与较长一边绳子上的结完全重合,如图所示&#xff…

MyBatisPlus 之一:Spring 整合 MyBatisPlus 及雪花算法

1. Mybatis-Plus简介 Mybatis-Plus(简称MP)是一个 Mybatis 的增强工具,在 Mybatis 的基础上只做增强不做改变,为简化开发、提高效率而生。这是官方给的定义,关于mybatis-plus的更多介绍及特性,可以参考http…

腾讯云有免费服务器吗?在哪领取?

腾讯云免费服务器申请入口 https://curl.qcloud.com/FJhqoVDP 免费服务器可选轻量应用服务器和云服务器CVM,轻量配置可选2核2G3M、2核8G7M和4核8G12M,CVM云服务器可选2核2G3M和2核4G3M配置,腾讯云服务器网txyfwq.com分享2024年最新腾讯云免费…

力扣经典题:删除字符使字符串变好

char* makeFancyString(char* s) {int sizestrlen(s);char*arr(char*)malloc(sizeof(char)*size1);if(size<3){return s;}arr[0]s[0];arr[1]s[1];int p2;for(int j2;j<size;j){if(s[j]!s[j-1]||s[j]!s[j-2]){arr[p]s[j];p;}}arr[p]\0;return arr; } 此代码的细节很多&am…

小车倒立摆系统能控和能观性分析

一、能控性 系统的能控性&#xff08;Controllability&#xff09;是控制理论中的一个基本概念&#xff0c;它描述了系统状态是否能够在有限时间内&#xff0c;通过适当设计的输入&#xff08;或控制信号&#xff09;&#xff0c;从任何初始状态转移到任何期望的最终状态。如果…

无人机自动返航算法实现与优化

一、引言 随着无人机技术的快速发展&#xff0c;其在航拍、农业、救援等领域的应用越来越广泛。在这些应用中&#xff0c;无人机的自动返航功能显得尤为重要。一旦无人机失去控制或与遥控器失去连接&#xff0c;自动返航算法能够确保无人机安全返回起飞点&#xff0c;避免损失和…

Python爬取淘宝商品评价信息实战

文章目录 一、分析需要爬取的页面二、实现爬取商品评价信息的代码1、通过解析显示评价信息的元素获取商品评价信息2、通过mitmproxy代理进行流量抓包获取商品评价信息 三、附-完整代码 前期出了一个《爬取京东商品评价信息实战》的教程&#xff0c;最近又有网友提到要出一个爬淘…

解决google Chorme 隐私设置错误

问题&#xff1a; 我们在使用浏览器的时候&#xff0c;出现隐私设置错误“您的链接不是私密连接”&#xff0c;如下图所示&#xff1a; 第一步开始来解决隐私设置错误&#xff0c;打开浏览器之后&#xff0c;点击右上方的三点图标&#xff0c;选择设置&#xff0c;如下图所示&…

24考研数学最大教训❗️660/880过时了?

我没看错吧&#xff0c;说660题和880题过时了&#xff1f; 660题和880题好好用&#xff0c;这俩很经典不会过时。 660题是客观题训练必刷的一本题集&#xff0c;而880是强化阶段非常好的一本综合性题集。我本身在考研的时候使用的也是这两本题集&#xff0c;所以对这两本题集…

Nginx部署项目,上传文件报错413,如何解决?

报错场景 我搭建的wordpress&#xff0c;上传主题无法上传&#xff0c;报错413 解决思路 报错413是因为Nginx对上传大小做了限制&#xff08;Nginx默认限制上传大小为1MB&#xff09;&#xff0c;所以我们需要通过修改配置文件的方式来去除这个限制&#xff0c;或者说是提高这…

el-dialog弹框遮罩层问题

先看一下出现的bug&#xff0c;点击按钮出现弹框的时候&#xff0c;遮罩层出现在弹框上层&#xff0c;不知道是那个同事写的全局样式影响的&#xff0c;这个时候我们需要在el-dialog标签上添加一个属性就行 :modal-append-to-body“false” 下图是出现的问题&#xff0c;遮罩层…

SpringBoot(整合MyBatis + MyBatis-Plus + MyBatisX插件使用)

文章目录 1.整合MyBatis1.需求分析2.数据库表设计3.数据库环境配置1.新建maven项目2.pom.xml 引入依赖3.application.yml 配置数据源4.Application.java 编写启动类5.测试6.配置类切换druid数据源7.测试数据源是否成功切换 4.Mybatis基础配置1.编写映射表的bean2.MonsterMapper…

PHP序列化基础知识储备

一、序列化与反序列化 1、概念 PHP中的序列化是指将复杂的数据类型转换为可存储或可传输的字符串&#xff0c;而反序列化则是将这些字符串重新转换回原来的数据类型。 序列化通常使用 serialize() 函数完成&#xff0c;它可以将数组、对象、字符串等复杂数据类型压缩到一个字…

m3u8,一个超酷的 Python 库!

更多资料获取 &#x1f4da; 个人网站&#xff1a;ipengtao.com 大家好&#xff0c;今天为大家分享一个超酷的 Python 库 - m3u8。 Github地址&#xff1a;https://github.com/globocom/m3u8 在网络视频传输中&#xff0c;HLS&#xff08;HTTP Live Streaming&#xff09;是一…

后端系统开发之——创建SpringBoot工程

原文地址&#xff1a;后端框架系统开发之——创建SpringBoot工程 - Pleasure的博客 下面是正文内容&#xff1a; 前言 现在的市场环境&#xff0c;如果你单单只是作为前端工程师或者是后端工程师&#xff0c;在开发Web应用的时候都需要去读取企业提供的接口文档。而当你前后端…

python--剑指offer--中等--07. 重建二叉树

输入某二叉树的前序遍历和中序遍历的结果&#xff0c;请重建该二叉树。假设输入的前序遍历和中序遍历的结果中都不含重复的数字。 例如&#xff0c;给出 前序遍历 preorder [3,9,20,15,7] 中序遍历 inorder [9,3,15,20,7] 返回如下的二叉树&#xff1a; 3/ 9 20 / 15 7 …

数字后端 EDA 软件分享

数字后端 EDA 软件分享 推荐这几家的EDA工具吧&#xff0c;虽说我也支持国产工具&#xff0c;但是我还是选择了这几家的工具 apache cadence mentor synopsys 下图我现在用的eda环境&#xff0c;利用网上的资源&#xff0c;自己独立在vmware上搭建好的EDA环境 除去pdk&#…

mybatis项目中配置sql提示

2023版的idea好像内置了这个功能。 第一步&#xff1a; 第二步&#xff1a;第一步完成后user会爆红&#xff0c;这时我们需要连接数据库。

AI预测-一文解析AI预测数据工程

AI预测相关目录 AI预测流程&#xff0c;包括ETL、算法策略、算法模型、模型评估、可视化等相关内容 最好有基础的python算法预测经验 EEMD策略及踩坑VMD-CNN-LSTM时序预测对双向LSTM等模型添加自注意力机制K折叠交叉验证optuna超参数优化框架多任务学习-模型融合策略Transform…

Mock 测试入门:什么是 Mock 测试

Mock测试 什么是 Mock &#xff1f; Mock 的意思就是&#xff0c;当你很难拿到源数据时&#xff0c;你可以使用某些手段&#xff0c;去获取到跟源数据相似的假数据&#xff0c;拿着这些假数据&#xff0c;前端可以先行开发&#xff0c;而不需要等待后端给了数据后再开发。 Mo…