【MySQL数据库 | 第十二篇】:约束

news2024/11/26 2:38:33

约束:

在MySQL中,约束是一种限制数据表中列值的规定。保证数据库中的数据正确,有效性和完整性。MySQL中的约束有以下几种:

1. 主键约束(Primary Key Constraint):主键是用于唯一标识表中每行记录的列。主键约束要求每个主键列的值都是唯一的,且不能为NULL。一个表只能有一个主键。

2. 唯一约束(Unique Constraint)唯一约束要求列中的值各不相同,且可以为空(NULL)。一个表可以有多个唯一约束。

3. 非空约束(Not Null Constraint):非空约束要求列中的值不能为NULL

4. 外键约束(Foreign Key Constraint):外键是用于关联两个表的列。外键约束要求参照表中必须存在与被参照表中主键列相符的值。MySQL中的外键约束需要引用参照表中的主键列,从而保证参照表中的值是唯一的。

5.默认约束(Default constraint):保存数据的时候,如果未指定该字段的值,就采用默认值。

6.检查约束(Check constraints):保证字段值满足某一个条件

这些约束可用于对表中数据进行更全面、更安全的控制。例如,主键可以确保每个表行的唯一标识,唯一约束可以保证表中没有重复数据,非空约束可以避免NULL值,外键约束可以确保数据表之间的数据完整性。

b1a9c15ddc274cfa97d64cd6d6c4344a.png


 

约束时作用在字段上的,它可以限制字段的数据。在创建表或修改表的时候添加约束,一个字段我们可以添加多个约束。


案例:创建以下表:
1389709760384f379264f3609ff64e98.png

 代码:

create table user (
    id int primary key  auto_increment comment '年龄' ,
    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'性别'
)comment'用户表';

 运行结果:
3215f39d9bbb447587cf01e80a14a491.png

 我们通过插入数据来一个个验证约束的功能

1.id的主键约束:

insert into user(name, age, status,gender) values('tom',19,'1','男'),('koy',14,'1','女');

结果:

94d76f2b21c04e89a012eb9e5bd7ce5c.png

 我们发现即使不给id插值,他也会按照我们设定好的递增进行,也就是永远不会出现id重复的情况,而不会重复的id就作为每条数据的唯一标识。

在这里需要注意错误的数据虽然会因为约束而不能存储到表中,但是他也会有自己的主键,只是我们无法在这张表中调用,因此如果我们如果表中已经有两条数据,我们再输入不符合约束的两条数据,第五次输入一条符合约束的数据,那么此时这条符合约束的数据的id应该是5,而不是3,因为前面那两条没有输入成功的数据也为自己获取了一个唯一的主键,我们可以看下面status的默认约束来验证这条结论。

2.name的非空约束:

insert into user(name, age, status,gender) value(null,17,'1','男');

结果:

由于非空约束这里会直接报错,但是要注意的是空字符不是空,这里的非空约束是指值不能为NULL;
 67277fff9e34411898297a579da599bc.png

 name的唯一约束:

insert into user(name, age, status,gender) value('koy',10,'1','女');

结果:前面已经有koy这个名字了,受到唯一约束的影响,此时如果我们名字重复,会直接报错。

5e065d01ff214ceda3e6eff87bc5d50c.png

 3.age的检查约束:

insert into user(name, age, status,gender) value('kot',130,'1','女');

结果:我们在前面定义的时候,约定了age的年龄范围在1-119之间,因此输入age=130会报错

d36dc4d159c545a1ba15b64fc047ce61.png

 4.status的默认约束:

默认约束采取有输入采取输入值,没输入采取默认值的做法。 

insert into user(name, age,gender) value('kob',15,'女');

结果:
 d6651ac3489c4316987e2fb24241479c.png

 5.外键约束:

添加外键:


在这里我们预先建立一张表:
76f86fa7390044f7ae1d9e1299a58ce0.png

 而他和我们之前那张表的关系为:

f0b7f37f593b45fe843e26f91716e69c.png

 这两张表之间的关系为我们的status需要通过第二张表来补全。我们把具有外键status的表称为是子表,具有外键指向的主键的表我们称为是父表。但是目前来讲,这两张表只在逻辑上有关系,但是在数据库层面并没有建立起任何关系,如果我们删除dept表中的1,user中status列中的1仍然存在,这个时候就需要给user中的status加上外键约束

创建外键的语法:

CREATE TABLE 表名(
    字段名 数据类型,
    .....
    [CONSTRAINT][外键名称]FOREIGN KEY(外键字段名) REFERENCES 主表 (主表列名)
);

ALTER TABLE 表名 ADD CONSTRAINT 外键名称 FOREIGN KEY (外键字段) REFERENCES 主表 (主表列名);

案例:我t们为user中的status添加外键约束,使其与dept表相连。

alter table user add constraint fk_user_dept_id foreign key (status) references dept(id) ;

执行成功以后我们会发现status上方多出来一个蓝色的钥匙 ,就说明它已经是一个外键了

9743cbcc01eb400e9a34074ab1668ca4.png

 此时我们尝试在dept中删除id为1.a555ea5a93cf4dbc9324583fe7d05d37.png

 就会报错,因为此时user表中还有关于这个id的信息,因此我们的父表不可以对这个数据进行删除,我们也就在两个表之间建立了关联。

外键的删除:

ALTER TABLE 表名 DROP FORGEIGN KEY 外键名称

外键约束:
ed50acf1b9024271bf61b33e171f51ea.png

 语法:

alter table 表名 add constraint 外键名称 foreign key (外键字段) references 主表名(主表字段名) ON UPDATE CASCADE ON DELETE CASCADE ;

 

结束!
 

 

 

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

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

相关文章

国内强大的智能语言模型AI

​ Yan-英杰的主页 悟已往之不谏 知来者之可追 C程序员&#xff0c;2024届电子信息研究生 目录 前言 环境列表 视频教程 1.飞书设置 2.克隆feishu-chatgpt项目 3.配置config.yaml文件 4.运行feishu-chatgpt项目 5.安装cpolar内网穿透 6.固定公网地址 7.机器人权…

chatgpt赋能python:Python文件目录切换:简单易用的方法

Python文件目录切换&#xff1a;简单易用的方法 Python语言可以轻松地处理文件和目录。使用Python的os库可以方便地操作文件系统。Python在os库中提供了许多可以轻松完成文件和目录操作的函数&#xff0c;其中之一是os.chdir。os.chdir函数用于更改当前的工作目录。 为什么需…

使用阿里云OSS实现图片文件上传

说明&#xff1a;注册用户时&#xff0c;经常会用到上传头像。文件的上传/接收与一般文本数据不同。 一、创建Demo页面 先准备一个Demo页面 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><title>图片上传…

第三章 三段论:所有,有的。

第三章 三段论&#xff1a;所有&#xff0c;有的。 第一节 三段论-推结论 题-三段论-结构-推结论&#xff1a;所有A是B&#xff1b;所有B是C&#xff1b;得&#xff1a;所有A是C。&#xff08;最简单的模型&#xff09; 4.所有高明的管理者都懂得关心雇员福利的重要性&…

Linux目录结构(与window目录结构对比+绝对路径和相对路径)

一、Linux目录结构 Linux目录结构是一个标准化的文件系统层次结构&#xff0c;非常有组织性并且易于管理。而与Windows 操作系统不同&#xff0c;Linux将所有文件和设备都组织在一个单一的根目录下。以下是Linux的标准目录结构&#xff1a; /&#xff1a;根目录&#xff0c;包含…

<DB2>《DB2数据库健康检查》第3部分

《DB2数据库健康检查》第3部分 2 数据库对象检查2.12 检查是否需要对表和索引进行runstats(30天未作统计更新)2.13 检查表和索引是否需要重组2.14 查看表空间所在裸设备权限2.15 查看数据库备份进度 2 数据库对象检查 2.12 检查是否需要对表和索引进行runstats(30天未作统计更…

递归sql查询完整科目名称

已知表 科目编号 科目名称 1001 1001 现金 1002 1002 银行存款 10020100 0100 工商银行存款 100201000001 0001 工行重庆路支行 10020200 0200 建设银行存款 100202000001 0001 建行铁北支行 需要整理成 科目编号 科目称 科目全称 1001 现金 现金 1002 银行存款 银行存款 …

【OI学习笔记】基础算法-前缀和与差分算法

板块&#xff1a;基础算法、线性优化 难度&#xff1a;较易 前置知识&#xff1a;C基础语法 一、前缀和 1、定义 在一维空间中&#xff0c;对于一个数据总量为 n n n 的数组 a a a&#xff0c;有数据 a [ 1 ] , a [ 2 ] , a [ 3 ] , . . . , a [ n − 1 ] , a [ n ] a[1]…

计算数组中各元素的平方根numpy.sqrt()

【小白从小学Python、C、Java】 【计算机等考500强证书考研】 【Python-数据分析】 计算数组中各元素的平方根 numpy.sqrt() 选择题 以下程序的运行结果是? import numpy as np a np.array([1, 4, 9, -4]) print("【显示】a ", a) print("【执行】np.sqrt(a)&…

计网常见面试题

参考:小林coding 1.TCP/IP模型 2.说一下TCP的三次握手? 第一次握手:客户端向服务端发起建立连接请求,客户端会随机生成一个起始序列号x,客户端向服务端发送的字段中包含标志位SYN=1,序列号seq=x。第一次握手前客户端的状态为CLOSE,第一次握手后客户端的状态为SYN-SENT。…

Stable Diffusion 从听说到超神日记(从安装开始)

1.安装模型&#xff08;B站搜秋叶&#xff09; 看到下面界面就成功了&#xff01; 下载好模型打开主页&#xff01;点击右下角一键启动&#xff01; 首先弹出下面命令界面。 自动弹出一个网页界面&#xff08;地址是http://127.0.0.1:7860/?__themelight&#xff09;&#xf…

Zabbix(二)

所有实验的zabbix_agent客户端都是web1(192.168.29.142) 模板Template 模板是可以方便地应用于多个主机的一组实体。 实体可以是&#xff1a; 监控项触发器图表仪表盘低级别自动发现规则web场景 模板通常用于为特定服务或应用程序&#xff08;如Apache&#xff0c;MySQL&am…

第二章 模态命题:必然、可能

第二章 模态命题&#xff1a;必然、可能 第一节 模态命题-句式转换-逻辑转换 题-模态命题-句式转换-逻辑转换&#xff1a;①不一定不可能&#xff1b;②不一定可能不未必。 1.唐代韩愈在《师说》中指出&#xff1a;“孔子曰&#xff1a;三人行&#xff0c;则必有我师。是故…

MM32F3273G8P火龙果开发板MindSDK开发教程1 - 点亮LED

MM32F3273G8P火龙果开发版MindSDK开发教程1-点亮LED 1、登录官网下载对应的MindSDK固件 https://mindsdk.mindmotion.com.cn/&#xff0c;然后注册下载mm32F3270的固件即可。 下载完的文件为 plus-f3270_mdk.zip 解压后的文件路径如图&#xff1a; 2、新建LED工程 将下载…

ModNet抠图算法及摄像头实时抠图示例

目录 一、视频抠图采用绿幕的原因 1、摄像机成色原因 2、抠图效果原因 3、经济成本 二、抠图背景知识 1、Trimap 2、什么是抠图 3、抠图算法分类 三、Deep Image Matting算法 1、网络结构图 2、算法解读 &#xff08;1&#xff09;Encoder-Decoder阶段 &#xff0…

vue3 -- lottie-web使用

Lottie简介 官方介绍:Lottie是一个库,可以解析使用AE制作的动画(需要用bodymovie导出为json格式),支持web、ios、android、flutter和react native。在web端,lottie-web库可以解析导出的动画json文件,并将其以svg或者canvas的方式将动画绘制在我们的页面上. Lottie的优点 …

chatgpt赋能python:Python版本切换教程

Python版本切换教程 Python是一种高级编程语言&#xff0c;用于多种编程任务。但是&#xff0c;由于Python版本之间的不兼容性&#xff0c;有时候需要切换Python版本以满足特定的需求。在本文中&#xff0c;我们将介绍Python版本切换的方法&#xff0c;包括安装和使用多个版本…

机器学习 | 集成算法 | Bagging | Boosting | 概念向

&#x1f4da;Bagging和Boosting的概念 集成学习&#xff08;Ensemble Learning&#xff09;就是通过某种策略将多个模型集成起来&#xff0c;通过群体决策来提高决策准确率。为什么集成学习会好于单个学习器呢&#xff1f;原因可能有三&#xff1a; 训练样本可能无法选择出最好…

【ARMv8 SIMD和浮点指令编程】NEON 通用算术指令——杂项也不少

算术通用指令杂项包括以下指令: UABA、UABAL/UABAL2、UABD 和 UABDL/UABDL2。无符号向量差值绝对值累加和差值绝对值。 ABS 和 NEG向量绝对值和求反。 UMAX、UMIN、UPMAX、UPMIN、UMAXV 和 UMINV。无符号向量最大值,无符号向量最小值,无符号向量按对最大值,无符号向量按对最…

chatgpt赋能python:Python怎么分行输出?教程来了!

Python怎么分行输出&#xff1f;教程来了&#xff01; Python是一种解释型、面向对象、动态数据类型的高级编程语言。在Python中&#xff0c;分行输出是非常常见的操作&#xff0c;本文将介绍Python分行输出的不同方式以及使用的情况。 一、使用换行符 使用换行符是Python分…