news 2026/7/27 23:54:03

【数据库】数据库约束

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
【数据库】数据库约束

第四章 数据库约束


文章目录

  • 第四章 数据库约束
  • 前言
  • 一、NOT NULL非空约束
  • 二、default默认值约束
  • 三、unique唯一约束
  • 四、primary key 主键约束
  • 五、外键约束
  • 六、check约束
  • 总结

前言

数据库约束是对表中的数据施加规则。就像我们注册账号时的必添项,那就是约束,本期会讲解怎么实现~


一、NOT NULL非空约束

约束需要在创建表的时候添加
非公约数就是指填写表的那一栏不能为空,为空报错.

create table 表名 (列名 类型 not null,列名 类型);

示例:


用desc来查看表结构,null那里会显示no


二、default默认值约束

插入列的时候,剩下没被指定列就是默认值

我们可以指定默认值

create table 表名 (列名 类型,列名 类型 default ‘默认值’);

示例:

  1. default前 :


  1. default后 :

三、unique唯一约束

唯一约束,也就是插入数据唯一
每次插入/修改数据的时候都会先进行查询(数据库自动进行),判定插入/修改的数据是否已经存在,如果存在了就会失败。
怎么实现呢?

create table 表名 (列名 类型 unique,列名 类型);

示例:

用update修改也会报错

Distinct,是本来数据库服务器存储的内容中已经有重复的了,只是展示给用户时展示的是去重的效果 , unique是存的数据就不能有重复


四、primary key 主键约束

主键就是不能重复,并且不能为空。一张表中只能有一个主键

create table 表名 (列名 类型 primary key,列名 类型);

示例:

插入为空报错 :


插入为重复报错 :


设计数据表时 , 一般都会给表设定一个主键列,主键列通常是一个整数ID

手动指定ID的值可能会遇到重复的情况,数据库提供了自增主键功能,主键的值不需要手动分配 ,会自动分配,

自增组件会记录最大值 ,哪怕把表内容删掉,也会按原来原本最大值继续加一

create table 表名 (列名 类型 primary key auto_increment ,列名 类型);

示例 :

提问 :
同一个表的数据 , 分布在不同服务器上(分库分表) , 这样的情况自增主键是否还有效?
答 :
服务器之间相互查询开销太大 , 因此自增主键仅限于单节点的MySQL服务器场景使用
该情况的解决方案有很多,核心理念是类似的 : 分布式唯一ID = 时间戳 + 主机标识 + 随机因子 的哈希函数


五、外键约束

涉及两张表,子表和父表,被涉及的子表列对应父表的行

create table 父表名字 (列名 类型 primary key auto_increment,列名 类型);

create table 子表名 (列名 类型 ,列名1 类型,foreign key (列名1 ) references 父表名 (涉及的列名 ) );

示例 :


针对子表的插入,会对父表先进行查询,查到了才会插入,否则报错。


用update也是一样触发查询

示例 :


如果子表与父表中的一列建立了联系,我们把父表那一列delete删除的时候会报错

示例 :


提问 :
电商中,一张父表:商品表,一张子表:订单表
如使用外键,想要下架一个商品的时候,因子表有与父表相关联的,所以删不掉,怎么办?

可以使用标志位,进行逻辑删除,返回商品列表的时候,就通过标记位进行删除。
逻辑删除,意味着数据库内容越来越多
但这不是主要矛盾,硬盘不值钱,不用纠结。


提问 :

create table 父表名字 (列名 类型 ,列名 类型);
create table 子表名 (列名 类型 ,列名1 类型,foreign key (列名1 ) reference 父表名 (涉及的列名 ) );

为什么会报错 ?

回答 :

要求子类引用的那一类要带有索引,而主键或者唯一键会自动创建索引


六、check约束

check会自动检查填入的列是否符合要求,就像性别那一栏,填入沃尔玛购物袋是不合理的。

create table 表名 (列名1 类型,check(列名1=‘名称’ or 列名1=‘名称’) );

示例 :

插入成功 :

插入失败 :

但这个是从mysql8.0.16开始支持的,一些老项目是用5.7


总结

本期主要讲了not null非空主键 , default默认值约束 , unique唯一约束 , primary key主键约束 , 外键约束 , check约束等 . 请大家放心使用~~

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/7/27 23:45:56

AI提示词优化:如何让大语言模型更听话

1. 为什么你的AI总是不听话? 上周我让实习生帮忙整理会议纪要,结果收到一份连标点符号都没改的录音转写稿。这让我想起三个月前第一次用ChatGPT的场景——输入"写个产品介绍",AI给我生成了一篇从维基百科复制来的技术参数表。那一刻…

作者头像 李华
网站建设 2026/7/27 23:45:16

从艺术展览到技术实现:解析“能量脉动”背后的创意编程与多媒体集成

这次我们来看一个将艺术展览与创意能量结合的项目——“锦江艺术季第四季启幕,首展‘能量脉动——Idea!’”。这个项目并非传统的技术工具或开源模型,而是一个线下艺术展览活动。对于技术博客的读者而言,其核心价值在于探讨如何将“想法”&am…

作者头像 李华
网站建设 2026/7/27 23:44:53

本地化AI数字人视频生产方案:成本降至0.3元/条

1. 项目概述:本地化数字人视频生产流水线 数字内容创作领域正在经历一场由AI驱动的生产力革命。作为一名长期深耕视频生产自动化的从业者,我花了三个月时间验证了一套完全基于本地开源模型的数字人视频生产方案。这套方案的核心价值在于: 将…

作者头像 李华
网站建设 2026/7/27 23:44:49

Python afrr-remuneration 包详解:功能、安装、语法与实战案例

1. 引言 afrr-remuneration 是一个专注于非洲可再生能源领域(African Renewable Energy)薪酬与补贴计算的 Python 工具包。该包主要用于处理与频率恢复储备(Frequency Restoration Reserve, FRR)相关的 remuneration(报酬/补偿)计算,帮助能源从业者、数据分析师和研究人…

作者头像 李华
网站建设 2026/7/27 23:40:20

元强化学习:让AI快速适应新任务的核心技术

1. 元强化学习:让AI学会"学习的方法" 在传统强化学习中,我们经常会遇到这样的困境:一个在Atari游戏《打砖块》中表现优异的AI,换到《太空侵略者》就完全不会玩了;一个在模拟环境中训练出的自动驾驶模型&…

作者头像 李华