当前位置: 首页 > news >正文

MySql数据库约束

概述、目的

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。
目的:保证数据库中数据的正确性、有效性和完整性。

分类:

约束描述关键字
非空约束限制该字段的数据不能为nullNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
外键约束用来让两张表的数据之间建立连接,保证数据的一致性和完整性FOREIGN KEY
自动增加默认情况下,该字段的值是从1开始自增的AUTO_ INCREMENT
检查约束(8.0.16版本之后)保证字段值满足某一个条件CHECK

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。

主键约束

字段名 数据类型 primary key;--基本语法
#第一种方式
CREATE TABLE student(id int primary key,name varchar(50)
);
--方式二
CREATE TABLE student(id int,name varchar(50),primary key(id)
);
--联合主键
CREATE TABLE student(classid int,studentid int,name varchar(50),primary key(classid,studentid)
);

约束演示

上面我们介绍了数据库中常见的约束,以及约束涉及到的关键字,那这些约束我们到底如何在创建表、修改表的时候来指定呢,接下来我们就通过一个案例,来演示一下。

案例需求: 根据需求,完成表结构的创建。需求如下:
在这里插入图片描述
对应的建表语句为:

CREATE TABLE tb_user(id int AUTO_INCREMENT PRIMARY KEY COMMENT 'ID唯一标识',name varchar(10) NOT NULL UNIQUE COMMENT '姓名' ,age int check (age > 0 && age <= 120) COMMENT '年龄' ,status char(1) default '1' COMMENT '状态',gender char(1) COMMENT '性别'
);

在为字段添加约束时,我们只需要在字段之后加上约束的关键字即可,需要关注其语法。我们执行上面的SQL把表结构创建完成,然后接下来,就可以通过一组数据进行测试,从而验证一下,约束是否可以生效。

insert into tb_user(name,age,status,gender) values ('Tom1',19,'1','男'),
('Tom2',25,'0','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values (null,19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom3',19,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom4',80,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',-1,'1','男');
insert into tb_user(name,age,status,gender) values ('Tom5',121,'1','男');
insert into tb_user(name,age,gender) values ('Tom5',120,'男');

在这里插入图片描述
上面,我们是通过编写SQL语句的形式来完成约束的指定,那加入我们是通过图形化界面来创建表结构时,又该如何来指定约束呢? 只需要在创建表的时候,根据我们的需要选择对应的约束即可。
在这里插入图片描述

外键约束

外键:用来让两张表的数据之间建立连接,从而保证数据的一致性和完整性。

--方式一
CREATE TABLE 表名(
字段名 数据类型,
...
[CONSTRAINT] [外键名称] FOREIGN KEY (外键字段名) REFERENCES 主表 (主表列名)
);
ALTER TABLE 从表名 ADD CONSTRAINT 外键名 FOREIGN KEY (从表外键字段) REFERENCES 主表 (主键字段);

外键名常用命名方式:

fk_从表名_从表外键字段

外键

外键是指引用另一个表中的一列或多列,被引用的列应该具有主键约束或唯一性约 束。外键用于建立和加强两个表数据之间的连接。为了更好地理解外键的定义及其作用,我们来看如下两张表:

CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender VARCHAR(10) DEFAULT '男'
);
CREATE TABLE score(scoreid INT PRIMARY KEY,studentid INT , scoreresult INT
);

score表中的studentid学生编号表示成绩是属于哪个学生,该值必须是student表中id列里的值。这种情况下:学生表student被称为主表,分数表score被称为从表。所以,我们可利用外键FOREIGN KEY将score中的studentid与student表中id建立起联系;代码如下:

CREATE TABLE student(id INT PRIMARY KEY,name VARCHAR(50) NOT NULL,gender VARCHAR(10) DEFAULT '男'
);
CREATE TABLE score(scoreid INT PRIMARY KEY,studentid INT , scoreresult INT,CONSTRAINT fk_score_studentid FOREIGN KEY (studentid) REFERENCES student(id)
);

当然,也可利用SQL语句设置外键,代码如下:

ALTER TABLE score ADD CONSTRAINT fk_score_studentid FOREIGN KEY(studentid) REFERENCES student(id);

现在,我们再来执行:

show create table score;

数据一致性

大家知道:建立外键是为了保证数据的完整和统一性。但是,如果主表中的数据被删除或修改从表中对应的数据该怎么办呢?很明显,从表中对应的数据也应该被删除,否则数据库中会存在很多无意义的垃圾数据。

删除外键

alter table 从表名 drop foreign key 外键名;

外键约束小结

  • 从表里的外键通常为主表的主键
  • 从表里外键的数据类型必须与主表中主键的数据类型一致
  • 主表发生变化时应注意主表与从表的数据一致性问题

相关文章:

MySql数据库约束

概述、目的 概念&#xff1a;约束是作用于表中字段上的规则&#xff0c;用于限制存储在表中的数据。 目的&#xff1a;保证数据库中数据的正确性、有效性和完整性。 分类&#xff1a; 约束描述关键字非空约束限制该字段的数据不能为nullNOT NULL唯一约束保证该字段的所有数据都…...

TripleCross:一款功能强大的Linux eBPF安全研究工具

关于TripleCross TripleCross是一款功能强大的Linux eBPF安全研究工具&#xff0c;该工具提供了后门、C2、代码库注入、执行劫持、持久化和隐蔽执行等功能。 功能介绍 1、使用一个代码库注入模块通过往进程的虚拟内存中写入命令来执行恶意代码&#xff1b; 2、提供了一个行劫…...

2023最牛教程,手把手教你成为年薪30W的测试开发

随着互联网行业的高速发展&#xff0c;快速高质量的产品版本迭代成为企业始终立于不败之地的迫切需求&#xff0c;而在短期迭代的快节奏中&#xff0c;传统测试工作面对更大压力&#xff0c;无法持续提供高效率高质量的人力支撑&#xff0c;所以越来越多的企业需要技术更为全面…...

“深度学习”学习日记。--ImageNet、VGG、ResNet

2023.2.14 一、小历史&#xff1a; 在2012年的ILSVRC(ImageNet Large Scale Visual Recognitoin Chanllege)&#xff0c;基于深度学习的方法AlexNet 以绝对优势获胜并且他颠覆了以前的图片识别方法&#xff0c;此后深度学习方法一直活跃在这个舞台。 二、ImageNet&#xff1…...

关于APP下载量提升的技巧

关于APP应用下载量提升&#xff0c;很多人都不是很了解。今天厦门巨神峰小编给大家说下关于APP下载量提升的几个技巧。 一、抓住流行趋势&#xff0c;提升APP下载量 1、利用社交媒体进行推广。社交媒体是当下最流行的推广手段&#xff0c;可以有效的将APP的消息传播到更多的用…...

以“大数据”赋能产业链精准招商

​ 随着我国产业发展的不断迭代升级&#xff0c;传统招商模式的不足逐步凸显&#xff0c;侧重土地与税费优惠的同质化竞争招商以及来者不拒的无门槛型招商已经遏制了区域产业的发展&#xff0c;导致各产业园区很难形成产业集聚及持续的吸引力。在这样的大环境下&#xff0c;产业…...

内存泄漏检测组件 -- hook

目录 hook malloc与free出现的问题 builtin_return_address(N) C/CLinux服务器开发/后台架构师【零声教育】-学习视频教程-腾讯课堂 hook malloc与free出现的问题 #define _GNU_SOURCE #include <stdio.h> #include <dlfcn.h> #include <stdlib.h> /****…...

Diffusion model(三): 公式结论

接上文 Diffusion model(一): 公式推导详解 这一节主要总结之前文章的公式结论 1. 已知x0x_{0}x0​时&#xff0c;sample过程的均值和方差 q(xt−1∣xt,x0)(xt−1;μ~(xt,x0),β~tI)\begin{aligned} q(x_{t-1}|x_{t}, x_{0}) \mathcal(x_{t-1}; \tilde{\mu}(x_{t}, x_{0}),…...

Angular笔记(二)组件

组件包括&#xff1a; HTML 模板: 声明页面渲染的内容TypeScript 类: 定义行为CSS 选择器: 定义组件在模板中的使用方式&#xff08;可选&#xff09;要应用在模板上的 CSS 样式 一、 创建组件: 使用 Angular CLI 创建一个组件 ng generate component <component-name>…...

微信小程序|基于小程序+C#制作一个超酷的个人简历

你还在用以前的方式投简历吗?趁着金三银四来临之际,跟随此文使用小程序制作一个便携超酷的个人简历,高调炫技,愉快的收offer吧! 一、小程序...

华为OD机试 - 最快到达医院的方法(Java JS Python)

题目描述 新型冠状病毒疫情的肆虐,使得家在武汉的大壮不得不思考自己家和附近定点医院的具体情况。 经过一番调查,大壮明白了距离自己家最近的定点医院有两家。其中: 医院A和自己的距离是X公里医院B和自己的距离是Y公里由于武汉封城,公交停运,私家车不能上路,交通十分不…...

92.【SpringCloud NetFilx】

SpringCloud(一)、这个阶段该如何学习?1.微服务介绍2.面试常见问题(二)、微服务概述1.什么是微服务?2. 微服务与微服务架构(1).微服务(2).微服务架构⭐(3). 微服务优缺点(4). 微服务技术栈有那些&#xff1f;(5). 为什么选择SpringCloud作为微服务架构(三)、SpringCloud入门概…...

[ahk]如何载入Scite的会话Session文件

加载session文件的AutoHotkey代码&#xff1a;oSciTE : ComObjActive("SciTE4AHK.Application") messageloadsession:d:\\ddd\\2023-2-15SciTE.session oSciTE.SendDirectorMsg(message)存储session文件的AutoHotkey代码&#xff1a;messagesavesession:d:\\ddd\\123…...

MyISAM和InnoDb的区别

MySQL 5.0以后的版本默认的存储引擎为InnoDb&#xff0c;之前是MyISAM。 现在说说两者的区别&#xff1a; 1.数据存储结构的不同 MyISAM存储文件&#xff1a;.MYD(存储表数据)&#xff0c;.MYI(存储表结构)&#xff0c;.FRM(存储表结构) InnoDb存储文件: .FRM(存储表结构)&am…...

K8s管理应用生命周期-Deployment篇

在k8s中部署应用程序流程 1、使用Deployment部署Java应用 kubectl create deployment web --imageXXX/java-demokubectl get deployment,pods 2、使用Service发布Pod kubectl expose deployment web --port80 --typeNodePort --target-port8080 --namewebkubectl get servic…...

类和对象(下)(二)

类和对象&#xff08;下&#xff09;&#xff08;二&#xff09;1.友元1.1友元函数1.2友元类2.内部类3.拷贝对象时的一些编译器优化&#xff08;vs2022&#xff09;&#x1f31f;&#x1f31f;hello&#xff0c;各位读者大大们你们好呀&#x1f31f;&#x1f31f; &#x1f680…...

MapBox-draw绘制插件的使用教程(含修改样式和方法封装)

mapbox-draw插件是官方推荐的用于支持在mapbox地图中绘制图形的插件库。好像并不是由官方编写的,但是官方觉得其好用就直接推荐大家也使用了,我用了2天感觉下来还是觉得很鸡肋。对于开发者来讲自由修改的程度不是很高。这篇文章简单说一下对于mapbox-draw的使用和修改。 第一…...

使用 ONLYOFFICE 转换 API 构建在线文档转换器

文档转换是非常常用、非常有价值的功能&#xff0c;可以帮助我们处理多种文档类型。ONLYOFFICE 编辑器可以轻松地将文档转换为多种格式。在这篇博文中&#xff0c;我们会向您展示&#xff0c;如何构建在 ONLYOFFICE 转换 API 上运行的在线转换器。 关于 ONLYOFFICE 转换 API 使…...

Kubernetes的负载均衡方案:MetalLB

私有云裸金属架构(这是相对云上环境来说,不是说无操作系统)上部署的 Kubernetes 集群,通常是无法使用 LoadBalancer 类型的 Service 的。因为 Kubernetes 本身没有为裸机群集提供网络负载均衡器的实现。 如果你的 Kubernetes 集群没有在公有云的 IaaS 平台(GCP,AWS,Azu…...

【项目】Vue3+TS CMS 基本搭建相关配置

&#x1f4ad;&#x1f4ad; ✨&#xff1a;Vue3 TS   &#x1f49f;&#xff1a;东非不开森的主页   &#x1f49c;: today beginning&#x1f49c;&#x1f49c;   &#x1f338;: 如有错误或不足之处&#xff0c;希望可以指正&#xff0c;非常感谢&#x1f609;   基本…...

小熊派gd32f303实战指南(9)— 硬件I2C驱动AT24C02 EEPROM从零到一

1. 硬件I2C与AT24C02基础认知 第一次接触硬件I2C时&#xff0c;我也被那些专业术语搞得一头雾水。简单来说&#xff0c;I2C就像两个人用摩斯密码交流——只需要两根线&#xff08;SDA数据线和SCL时钟线&#xff09;&#xff0c;就能让主设备&#xff08;GD32F303&#xff09;和…...

从Anaconda虚拟环境到Docker镜像:一份给数据科学家的迁移指南(避坑Dockerfile编写)

从Anaconda到Docker&#xff1a;数据科学家的环境迁移实战手册 当你的机器学习模型在本地运行良好&#xff0c;却在同事的电脑上频频报错时&#xff1b;当论文评审要求提供可复现的实验环境时&#xff1b;当需要将训练好的模型部署到云服务器时——conda虚拟环境的局限性便开始…...

跨越版本鸿沟:Matlab 2020b与VS2022混合编译环境搭建实战

1. 环境准备&#xff1a;当Matlab 2020b遇上VS2022 第一次尝试在Matlab 2020b里调用VS2022编译器时&#xff0c;命令行弹出的红色报错让我愣了半天。官方文档明确写着Matlab 2020b最高只支持VS2019&#xff0c;这就像让Windows XP运行最新版Photoshop——理论上不可能&#xff…...

掌握Windows 11精简艺术:Tiny11Builder实战手册

掌握Windows 11精简艺术&#xff1a;Tiny11Builder实战手册 【免费下载链接】tiny11builder Scripts to build a trimmed-down Windows 11 image. 项目地址: https://gitcode.com/GitHub_Trending/ti/tiny11builder 你是否曾因Windows 11的臃肿而烦恼&#xff1f;老旧设…...

SRWE终极窗口管理指南:免费解锁Windows窗口任意调整能力

SRWE终极窗口管理指南&#xff1a;免费解锁Windows窗口任意调整能力 【免费下载链接】SRWE Simple Runtime Window Editor 项目地址: https://gitcode.com/gh_mirrors/sr/SRWE 你是否曾为Windows窗口管理的限制感到困扰&#xff1f;想要调整游戏窗口大小进行高清截图&am…...

基于MCP协议构建AI知识库:Alexandria项目部署与核心工作流解析

1. 项目概述&#xff1a;让AI拥有自己的“亚历山大图书馆”如果你和我一样&#xff0c;长期与各种AI助手&#xff08;比如Claude、Cursor、Codex&#xff09;打交道&#xff0c;肯定会遇到一个头疼的问题&#xff1a;知识无法沉淀。今天你花半小时教会AI助手某个项目的架构细节…...

别再盲目刷LeetCode了!先把这5个编程基础打牢

文章目录前言一、代码规范&#xff1a;不是“洁癖”&#xff0c;是保命的底线二、函数式编程&#xff1a;不是玄学&#xff0c;是现代开发的通用语言三、Python基础工具&#xff1a;sys模块与可变参数&#xff0c;效率提升10倍的利器四、任务拆解能力&#xff1a;从“写代码”到…...

C#项目实战:用StackExchange.Redis+RedisDesktopManager构建一个简易用户会话缓存系统

C#实战&#xff1a;基于StackExchange.Redis构建高可用会话缓存系统 在分布式系统架构中&#xff0c;会话管理始终是开发者需要解决的核心问题之一。传统ASP.NET的InProc会话模式在Web Farm环境下会面临一致性挑战&#xff0c;而SQL Server会话状态又难以满足高并发场景的性能…...

STM32CubeMX外部中断实战:从按键消抖到LED状态切换

1. STM32CubeMX外部中断基础配置 第一次用STM32CubeMX配置外部中断时&#xff0c;我盯着那一堆选项有点懵。后来发现其实只要抓住几个关键点&#xff0c;整个过程就像搭积木一样简单。这里以最常见的按键控制LED为例&#xff0c;带你一步步实现这个功能。 首先打开CubeMX新建…...

从Claude Code到nanocode:轻量级AI编程助手核心架构与工程实践

1. 项目概述&#xff1a;从Claude Code到nanocode的轻量化之路 如果你是一名开发者&#xff0c;尤其是对AI编程助手&#xff08;AI Agent&#xff09;的内部工作原理充满好奇&#xff0c;那么你很可能听说过Anthropic的Claude Code。它是一个功能强大的命令行AI代理&#xff0…...