【MySQL数据库】约束

news2025/3/16 15:26:44

在MySQL数据库中,约束(Constraint)是用于限制表中数据的一种规则,目的是为了确保数据的完整性以及一致性。下面我们就从建表时的约束、建表后如何添加约束等几个方面,讲解MySQL中常用的几种约束。

创建时约束

分类

非空约束

非空:关键字为[not null]。用来约束数据的该字段不能设置空值,也就是说,这一列的每个数据都应该有值。

非空约束的特点:

①插入数据时必须给该字段设置值

②修改数据时不能将字段修改为null

create table tbname{
    id int not null,
    -- other
};

唯一约束

唯一:关键字为[unique]。用来约束数据的该字段不因该有重复的值,也就是说,这一列的每个数据都是不一样的。

唯一约束的特点:

①插入数据时,如果设置值,那么不能与该列其它数据一样否则失败。如果不设置值,那么可以为null,如果该列有多个null值,不违反唯一约束(都没有值,怎么判断它们相等呢,是吧)

②修改数据时,如果将null修改为具体的值,那么这个值不能与该列其它数据一致

create table tbname{
    id int unique,
    -- other
};

主键约束

主键:关键字为[primary key]。是唯一标识 表中每一行的 那一列字段的约束。

主键的三个要求:

①每个数据表都应该有一个唯一的主键

②主键不应该被频繁的修改

③为了满足条件二,主键该与业务无关,避免业务的改变带动主键频繁修改。

主键的三个特点:

①唯一性:主键一旦设置,就自动加上了唯一约束

②非空性:主键一旦设置,就自动加上了非空约束

③单一性:即主键最多只能有一个,如果想要有多个字段都作为标识,那么可以使用联合主键的方式将多个字段联合为一个主键。

主键约束中常常与自增约束搭配使用:

自增约束的关键字为:[auto_increment],即每次插入一条新的数据,无需赋值,就可以根据内部的计数器的值设置主键的值。

create table tbname{
    id int primary key auto_increment,
    -- other
};

默认约束

默认:关键字为[default]。是用来约束该字段不设值时,默认给的一个值。如果不约束则是默认null。

默认约束的特点:

就是在插入数据时,如果不插入该字段,该字段的值会根据默认约束的默认值填充。

外键约束

外键:关键字为[foreign key]。外键用于建立表与表之间的关系,确保在一个表中的某列值必须在另一个表中出现。

外键的使用:

create table tbname{
    id int primary key auto_increment,
    userid int foreign key references usertb(id)
};

 拥有外键的表称之为子表(从表),外键关联的表称之为父表(主表)。

子表中拥有外键约束的字段,引用(references)父表中的主键或者唯一键。外键约束确保子表中的每个外键值都在父表中有对应的值。

外键约束的类型:

cascade:如果父表删除行,则所有引用该行的子表行也会被自动删除

set null:如果父表删除行,则所有引用该行的子表行会被设置为NULL

set default:如果父表删除行,则所有引用该行的子表行会被设置为默认值

no action:如果试图删除父表的行而子表中仍有引用,将会抛异常,阻止删除

restrict:与no action相似,但是在删除或更新时,立即检查外键约束,而不是在事务结束时检查

外键使用的注意事项:

①子表的外键约束列的数据类型必须与父表的引用列的数据类型相同

②外键约束会影响增删改,确保外籍值的有效性会导致性能下降

如果子表插入的外键值为空,可以建立,在该表中称为孤儿数据

先建父表,再建子表。

先插入父表数据,再插入子表数据

先删除子表数据,再删除父表数据

先删子表,在删父表

检查约束

检查:关键字为[check]。检查约束是用来确保列中的值符合特定的条件的一种规则。

检查约束的使用:

create table tbname{
    id int primary key auto_increment,
    salary decimal check(salary >= 0)
};

应用

create table mytb(
    id int not null, #非空约束
    name varchar(20) #不设置就是可以为空
);
insert into mytb(name) values("stark");#err-id is not null
insert into mytb(id,name) values(1,"stark");#sucess
#创建时约束
create table mytb(
    id int not null default 123,
    name varchar(20)
);
insert into mytb(name) values("stark");#sucess-id默认为123 -is not null
#创建时约束
create table mytb(
    id int unique,
    nama varchar(20)
);
insert into mytb(id) values(1);#sucess
insert into mytb(id) values(1);#err-上面一条语句已经插入了一个id值为1的记录了

创建后约束

非空约束

#创建后约束
alter table mytb
modify name varchar(20) not null;
#删除约束
alter table mytb
modify name varchar(20) null;

默认约束

#创建后约束
alter table mytb
modify name varchar(20) default "";
#删除约束
alter table mytb
modify name varchar(20) default null;

根据上面的例子,我们呢大概率也清楚了大概的方法,在使用时可以不断地尝试。

表级约束 - 联合主键(键、索引)

#创建时约束:
create table mytb(
    id int,
    name varchar(20)
    [constraint id_name] unique(id, name)
);#[constraint 是为键key or 索引index起别名]
#创建后约束:
alter table mytb
add [constraint id_name] unique(id,name);
    
#删除:
    alter table mytb
    drop key id_name;
    
    alter table mytb
    drop index id_name;

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

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

相关文章

LSTM方法实践——基于LSTM的汽车销量时序建模与预测分析

Hi,大家好,我是半亩花海。本实验基于汽车销量时序数据,使用LSTM网络(长短期记忆网络)构建时间序列预测模型。通过数据预处理、模型训练与评估等完整流程,验证LSTM在短期时序预测中的有效性。 目录 一、实验…

[Windows] 轻量级景好鼠标录制器 v2.1 单文件版,支持轨迹+鼠标键盘录制复刻

[Windows] 轻量级景好鼠标录制器 链接:https://pan.xunlei.com/s/VOLHz0rPyqdhV4bgyTYuW6W7A1?pwd98uj# 软件特性: 高效播放控制:动作间隔优化至100 ms,进度条可视化,支持随机循环/多次播放。 深度自定义&#xff1…

LINUX --- KVM

什么是 KVM?– 基于内核的虚拟机简介 – AWS (amazon.com) 什么是 KVM? 基于内核的虚拟机(KVM)是一种软件功能,您可以将其安装在物理 Linux 机器上以创建虚拟机。虚拟机是一种软件应用程序,可作为另一台实…

LabVIEW VI Scripting实现连接器窗格自动化

通过VI Scripting自动化配置连接器窗格,可大幅提升开发效率、统一接口规范,并适配动态需求。以下为真实场景中的典型应用案例,涵盖工业、汽车电子及教育领域,展示其实际价值与实施效果。 特点: 程序化配置:…

网络安全信息收集[web子目录]:dirsearch子目录爆破全攻略以及爆破字典结合

目录 一、dirsearch 工具详细使用攻略 1. 安装 前提条件 安装步骤 可选:直接下载预编译版本 2. 基本用法 命令格式 参数说明 示例 3. 核心功能与高级用法 3.1 多线程加速 3.2 自定义字典 3.3 递归扫描 3.4 过滤响应 3.5 添加请求头 3.6 代理支持 3…

pandas表格内容比较

前阵子来了一个211大学实习生(小男生),要比较2个版本字段的变化,辅助完成系统升级字段替换,要求找出哪些字段是新增的,哪些字段是删除的,哪些字段是属性信息修改的,要求半天时间搞定…

TMS320F28P550SJ9学习笔记13: 软件I2C_驱动AT24Cxx存储芯片

今日尝试配置软件I2C通信,我的目标通信芯片是AT24C64,相较于AT24C02这样的8位寻址,它是16位寻址的,所以有些不同 文章提供测试代码讲解、完整工程下载、测试效果图 目录 软件I2C引脚初始化: C内联函数改变SCL与SDA的输…

手抖预防方法主要包括以下几个方面

手抖预防方法主要包括以下几个方面: 1. 心理调节:保持心情舒畅,避免过度紧张和焦虑。如有必要,可以寻求心理医生帮助进行心理调适。 2. 充分休息:保证充足的睡眠时间,避免熬夜和过度劳累。合理安排工作和…

SpringBoot MCP 入门使用

随着AI的火爆,最近发现MCP在未来确实大有可为,作为一名javaer怎么可以落后在历史洪流呢,根据官网和cursor也从零开始体验一下自定义mcp server。以后可以根据自己业务场景做出各种适合自身业务的工具。 至于什么是MCP 可以到https://modelcon…

Windows 11 安装Docker Desktop环境

1、确认CPU开启虚拟化 打开任务管理器,切换到“性能”选项卡,查看 CPU 信息。若“虚拟化”状态显示为“已启用”,则表示虚拟化已开启;若显示为“已禁用”,则需要在启动时进入 BIOS 开启虚拟化设置(若显示已…

汽车保养记录用什么软件记录,汽车维修记录查询系统,佳易王汽车保养维护服务记录查询管理系统操作教程

一、概述 本实例以佳易王汽车保养维护服务记录查询管理系统为例说明,其他版本可参考本实例。试用版软件资源可到文章最后了解,下载的文件为压缩包文件,请使用免费版的解压工具解压即可试用。 软件特点:1、功能实用,操…

深入理解C/C++堆数据结构:从原理到实战

一、堆的本质与特性 1.1 什么是堆数据结构? 堆(Heap)是一种特殊的完全二叉树,它满足以下核心性质: 堆序性:每个节点的值都满足特定顺序关系 结构性:完全二叉树的结构特性(除最后一…

【MATLAB实战】实现白鲸算法(BWO)优化BP神经网络:提升模型性能的新思路

一、什么是白鲸优化算法(BWO)? 白鲸优化算法是受自然界中白鲸群体行为和觅食策略启发的一种新型智能优化算法。白鲸在捕食过程中展现出高效的协作能力和适应性,例如通过“回声定位”搜索猎物位置群体间信息共享,这些行…

医疗资源联动,广州长泰医院与海南德雅医院共筑地贫防治新篇章

​ 为贯彻落实"健康中国"战略关于出生缺陷综合防治的部署要求,推动地中海贫血防治体系建设。2025年3月15日,广州长泰医院与海南德雅医院联合主办的“地中海贫血生殖遗传干预大型义诊暨合作签约仪式”在广州正式启动,活动以“爱与希…

DeepSeek在医学领域的应用

DeepSeek作为高性能AI大模型,在医学领域的应用场景广泛,结合其在数据处理、自然语言理解和深度学习方面的优势,显著推动了医疗行业的智能化转型。以下是其核心应用场景及具体案例: 1. 辅助诊断与决策支持 临床辅助诊断&#xff1…

3.数据结构-串、数组和广义表

串、数组和广义表 3.1串3.1.1串的类型定义、存储结构及其运算串的顺序存储串的堆式顺序存储结构串的链式存储 3.1.2 串的模式匹配算法BF算法*KMP算法(待更新) 3.2数组3.2.1数组的顺序存储3.2.2特殊矩阵的压缩存储对称矩阵三角矩阵对角矩阵 3.3广义表*案例…

苹果电脑杀毒软件CleanMyMac

杀毒软件在苹果家族中是一个小众软件,百度搜索苹果电脑杀毒软件,可能各种杀软良莠不齐,因为在这个市场非常小,绝大多数都是冲着“清理”去的,而不是杀毒。最近测试了一款Mac电脑杀毒软件,杀毒效果也是一般般…

Day16:二叉搜索树和双向链表

将一个 二叉搜索树 就地转化为一个 已排序的双向循环链表 。 对于双向循环列表,你可以将左右孩子指针作为双向循环链表的前驱和后继指针,第一个节点的前驱是最后一个节点,最后一个节点的后继是第一个节点。 特别地,我们希望可以…

Qt QML实现弹球消砖块小游戏

前言 弹球消砖块游戏想必大家都玩过,很简单的小游戏,通过移动挡板反弹下落的小球,然后撞击砖块将其消除。本文使用QML来简单实现这个小游戏。 效果图: 正文 代码目录结构如下: 首先是小球部分,逻辑比较麻…

如何在实际应用中测量和调整直线导轨的预紧力?

在实际应用中,准确测量和调整直线导轨的预紧力对于保证设备的性能和精度至关重要,但测量和调整直线导轨的预紧力需要根据具体的导轨型号和结构来选择合适的方法。以下是一些常见的测量和调整方法: 1、使用压力传感器:在一些先进的…