【建议收藏】数据库 SQL 入门——约束(内附演示)

news2024/10/5 7:21:37

请添加图片描述

文章目录

  • 📚引言
  • 📖约束
    • 📑非空约束
    • 📑唯一约束
    • 📑主键约束
    • 📑默认约束
    • 📑检查约束
    • 📑外键约束
      • 🔖外键的添加
      • 🔖删除/更新外键
  • 📍总结

📚引言

🙋‍♂️作者简介:生鱼同学,大数据科学与技术专业硕士在读👨‍🎓,曾获得华为杯数学建模国家二等奖🏆,MathorCup 数学建模竞赛国家二等奖🏅,亚太数学建模国家二等奖🏅。

✍️研究方向:复杂网络科学

🏆兴趣方向:利用python进行数据分析与机器学习,数学建模竞赛经验交流,网络爬虫等。

**约束作用于表中字段上的规则,用于限制储存在表中的数据。**在本文中我们主要介绍SQL中约束分类以及约束以及约束的不同类型,并作出演示。

📖约束

首先我们来看约束的主要分类,常见的约束分类如下:

约束描述关键字
非空约束限制该字段的数据不能为NULLNOT NULL
唯一约束保证该字段的所有数据都是唯一、不重复的UNIQUE
主键约束主键是一行数据的唯一标识,要求非空且唯一PRIMARY KEY
默认约束保存数据时,如果未指定该字段的值,则采用默认值DEFAULT
检查约束保证字段值满足一个条件CHECK
外键约束用来让两张表之间建立连接,保证数据的一致和完整FOREIGN KEY

我们可以选择在创建表或修改表的过程中进行约束的添加。

接下来,我们将会根据不同的约束类型进行分别介绍与演示。

📑非空约束

非空约束限制字段的数据不能为NULL,非空约束的关键字为NOT NULL。当我们希望在创建表的过程中添加非空约束的时候,我们可以使用下面的代码:

# 创建一个名为TABLE_NAME的表并且将Id和AGE设为非空
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) NOT NULL
)

当表已经创建后,我们可以使用下面的代码为字段添加约束:

ALTER TABLE TABLE_NAME ADD NOT NULL ( Id )

在我的数据库中,我已经预先创建了表EMP,建表结构如下:
在这里插入图片描述
如果我们想为name加上非空的约束,可以使用下面的代码:

ALTER TABLE EMP  MODIFY name varchar(255) NOT NULL;

结果如下:
在这里插入图片描述
当我们在这时想要插入一个数据的时候,我们发现没有name的设定已经不能够插入了:
在这里插入图片描述
另外,删除上述约束的代码为:

ALTER TABLE EMP MODIFY varchar(255) NOT NULL;

📑唯一约束

唯一约束表示该字段是唯一的,表示为UNIQUE。同样的添加唯一约束有两种方法,一种是在创建表结构的时候进行添加,另一种是创建表后进行更改,代码如下:

# 表示对AGE进行唯一约束
CREATE TABLE TABLE_NAME
(
Id int NOT NULL,
AGE varchar(10) UNIQUE
)

另外,我们还可以在建表的时候对某字段进行约束的命名,代码如下:

CREATE TABLE EMP
(
Id int NOT NULL,
AGE varchar(10)
CONSTRAINT UNIQUE EMP_ID_AGE UNIQUE (Id,AGE)
)

同样的,我们也可以在表创建后对唯一约束进行添加以及删除,代码如下:

# 为Id添加唯一约束
ALTER TABLE EMP ADD UNIQUE (Id);
ALTER TABLE EMP ADD CONSTRAINT uc_EMP_ID_AGE UNIQUE (Id,AGE);
# 删除名为uc_EMP_ID_AGE 的唯一约束
ALTER TABLE EMP DROP CONSTRAINT uc_EMP_ID_AGE;

📑主键约束

主键在每个表中只有一个,其是唯一的值并且不能包括NULL值,同样的我们可以在创建表的过程中指定主键或者在创建表后添加主键,代码如下:

CREATE TABLE EMP
(
Id int PRIMARY KEY,
AGE varchar(10)
)

在创建表后,我们可以通过ALTER来进行主键的添加和取消,代码如下所示:

# 为名为TABLE_NAME 的表的字段Id添加主键
ALTER TABLE TABLE_NAME ADD PRIMARY KEY (Id)
# 删除表中的主键
ALTER TABLE TABLE_NAME DROP PRIMARY KEY

📑默认约束

当我们想对某些字段进行默认值的设定时,可以使用默认约束,这种约束能够对插入的时候的数据赋予一个我们初始化的默认值,代码如下:

CREATE TABLE EMP
(
Id int NOT NULL,
NANME varchar(255) DEFAULT '无名氏'
)

或者在建表后对表格加上或者删除默认的约束,代码如下:

# 添加一个默认约束
ALTER TABLE EMP ALTER NANME SET DEFAULT '无名氏'
# 删除一个默认约束
ALTER TABLE EMP; ALTER NANME DROP DEFAULT;

📑检查约束

当我们希望都某个字段的值进行检查时,可以使用检查约束限定范围,可以在建表的过程中对其添加检查的条件,代码如下:

# 在括号中传入约束条件
CREATE TABLE EMP
(
Id int NOT NULL CHECK (Id>0),
NANME  varchar(255) NOT NULL
)

我们可以对后续添加的约束进行命名,从而更好的删除约束以及操作约束,代码如下:

ALTER TABLE EMP ADD CHECK (Id>0);
# 我们对该检查约束命名为chk_emp
ALTER TABLE EMP ADD CONSTRAINT chk_emp CHECK (Id>0 AND MAME='路人甲');

另外,删除约束也可以在建表之后进行。这时我们就可以利用其约束名,代码如下:

ALTER TABLE EMP DROP CONSTRAINT chk_emp;

📑外键约束

🔖外键的添加

添加外键可以把表进行链接,为了更好的解释外键,我们首先看一个例子:
假设我们员工表(EMP)如下:

Id名字部门
1张三1
2李四2
3王五3

我们还有一个部门表(PARTY)如下:

Id部门
1研发部
2销售部
3营销部

此时员工表的部门字段就是一个外键,我们通常把部门表称作母表,而员工表称作子表。在SQL中我们可以在创建的时候添加外键,或者创建后添加外键,代码如下:

CREATE TABLE EMP
(
Id int PRIMARY KEY,
NAME varchar(10) NOT NULL,
PARTY_ID int,
FOREIGN KEY (Id ) REFERENCES PARTY(Id)
)

特别的,在创建表后添加外键的代码如下:

ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id);

与此同时我们也可以撤销外键的约束,代码如下:

ALTER TABLE Orders DROP FOREIGN KEY FOREIGN_PARTY;

🔖删除/更新外键

当我们对表的某字段设定了外键时,删除外键中的数据通常是不允许的,假如我们希望外键的数据改变时在子表的操作发生改变,可以使用不同的行为对外键的更新或者删除做限定,行为分为以下几类:

行为说明
NO ACTION当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 RESTRICT 一致)
RESTRICT当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有则不允许删除/更新。(与 NO ACTION一致
CASCADE当在父表中删除/更新对应记录时,首先检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
SETNULL当在父表中删除对应记录时,首先检查该记录是否有对应外键,如果有则设置子表中该外键值为ull(这就要求该外键允许取nul)。
SETDEFAULT父表有变更时,子表将外键列设置成一个默认的值(Innodb不支持)
设顶外键更新或删除行为的语句如下所示:
# 对EMP表中的Id设置外键PARTY表中的Id
# 在更新PARTY表中的内容时检查该记录是否有对应外键,如果有,则也删除/更新外键在子表中的记录。
# 在删除PARTY表中的内容时首先检查该记录是否有对应外键,如果有则设置子表中该外键值为ull(这就要求该外键允许取nul)。
ALTER TABLE EMP ADD CONSTRAINT FOREIGN_PARTY FOREIGN KEY (Id) REFERENCES PARTY(Id) ON UPDATE CASCADE ON DELETE SET NULL;

📍总结

本次列举了SQL中常用约束相关语句,在实际学习的过程中还需要多学习以及使用才能熟练掌握。

余下的SQL内容我也将持续更新,如果感兴趣的话不妨订阅本专栏或者点个关注,我们下次再见。

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

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

相关文章

【高危】Apache Linkis Gateway模块存在身份验证绕过漏洞(CVE-2023-27987)

漏洞描述 Apache Linkis 是一个用于将上层应用与底层数据引擎解耦,提供标准化接口的中间件。Gateway 是 Linkis 接受客户端和外部请求的主要入口点, 在 Apache Linkis 受影响版本中,由于在 Linkis Gateway 部署时产生的Token默认为LINKIS_C…

Linux打印口/LPT口出厂测试工具与使用说明

1 软件功能 该软件用于在Linux平台测试CH35X/CH38X(PCI/PCIe转串并口)的并口各引脚功能是否正常。方便对设备进行出厂测试。 2 并口测试硬件治具 在测试前,需要制作单独的硬件治具,按下表连接信号线: 25针并口座子堵…

面向削峰填谷的电动汽车多目标优化调度策略

说明书 MATLAB代码:面向削峰填谷的电动汽车多目标优化调度策略 关键词:电动汽车 削峰填谷 多目标 充放电优化 参考文档:店主自己整理的说明文档,公式、约束、数据齐全,可联系我查看 仿真平台:MATLAB YA…

iPhone如何不用iTunes将视频传输到电脑上?

随着智能手机的普及,iPhone已经成为了人们生活中必不可少的一部分。而随着iPhone摄像功能的逐渐完善,越来越多的用户开始将iPhone作为拍摄视频的工具。 但是,将iPhone中的视频传输到电脑并进行后续编辑处理或者备份储存,对于许多…

二极管专题:二极管钳位电路

二极管钳位电路 之前我们说过二极管的限幅功能 二极管专题:限幅电路。今天说的二极管的钳位电路和二极管的限幅电路都是利用了二极管正向压降一定的这么一个特点。限幅电路和钳位电路你说区别大呢,它也不大,说小呢也不小。就看你怎么理解了&…

Linux proc文件系统介绍

Linux proc文件系统 /proc/cmdline Arguments passed to the Linux kernel at boot time. Often done via a boot manager such as lilo(8) or grub(8) proc/[pid]/coredump_filter Since kernel 2.6.23, the Linux-specific /proc/PID/coredump_filter file can be used …

大数据项目实战之数据仓库:电商数据仓库系统——第6章 数据仓库环境准备

第6章 数据仓库环境准备 6.1 数据仓库运行环境 6.1.1 Hive环境搭建 1)Hive引擎简介 Hive引擎包括:默认MR、Tez、Spark。 Hive on Spark:Hive既作为存储元数据又负责SQL的解析优化,语法是HQL语法,执行引擎变成了Sp…

【收藏】2023欧洲 KubeCon 和云原生大会上关于WebAssembly的一切

KubeCon CloudNativeCon EU 2023将于4月18日至21日在阿姆斯特丹举行,对于云原生开发者和云原生用户是一年中无比期待的大会。会议为期四天,是保持云原生计算最新趋势,与同行建立联系,并从行业专家学习的绝佳机会。此外&#xff0…

2023年税务师事务所行业研究报告

第一章 行业发展概况 1.1 行业概况 税务师事务所是依法设立并承办法律、法规、规章规定的涉税服务和鉴证业务的社会中介机构。税务师事务所的组织形式为有限责任制税务师事务所和合伙制税务师事务所,以及国家税务总局规定的其他形式。税务师事务所应当依法纳税&am…

软件测试实验:静态测试

目录 前言 一、实验目的 二、实验内容 三、实验步骤 四、实验过程 1、学生宿舍管理系统代码 2、汇总表 3、C语言编码规范 总结 前言 软件测试是软件开发过程中不可或缺的一个环节,它可以保证软件的质量和功能,提高用户的满意度和信任度。软件测…

通信工程有哪些SCI期刊推荐? - 易智编译EaseEditing

以下是通信工程领域的一些SCI期刊推荐: IEEE Transactions on Communications: 该期刊由IEEE出版,是通信工程领域的顶级期刊,涵盖了通信系统、信号处理、无线通信、光通信、网络通信、通信安全等方面的研究。 IEEE Journal on S…

如何使用公网远程访问jupyter notebook【cpolar内网穿透】

文章目录前言视频教程1. Python环境安装2. Jupyter 安装3. 启动Jupyter Notebook4. 远程访问4.1 安装配置cpolar内网穿透4.2 创建隧道映射本地端口5. 固定公网地址转载自远控源码文章:公网远程访问jupyter notebook【cpolar内网穿透】 前言 Jupyter Notebook&#…

【Redis】多级缓存

【Redis】多级缓存 文章目录【Redis】多级缓存1. 传统缓存的问题2. 多级缓存方案2.1 JVM进程缓存2.1.1 本地进程缓存2.1.2 Caffeine2.2 Nginx缓存2.2.1 准备工作2.2.21. 传统缓存的问题 传统的缓存策略一般是请求到达 tomcat 后,先查询redis,如果未命中…

微服务高级篇【3】之分布式缓存Redis集群

文章目录前言一 单机Redis存在的问题二 Redis的安装三 Redis持久化3.1 RDB持久化3.1.1 触发条件3.1.2 RDB原理3.1.3 小结3.2 AOF持久化3.2.1 AOF原理3.2.2 AOF配置3.2.3 AOF文件重写3.3 RDB与AOF对比四 Redis主从集群4.1 搭建主从架构4.2 搭建主从集群4.2.1 集群结构4.2.2 准备…

【FFmpeg】自定义编码器适配

目录1 编码流程1.1 整体流程1.2 内部流程2 适配接口2.1 init、close2.2 option2.3 receive2.4 encode2.5 零拷贝的设计1 编码流程 FFmpeg是一个开源的多媒体框架,底层可对接实现多种编解码器,下面参考文件doc/examples/encode_video.c分析编码一帧的流程…

Adobe Illustrator2023(AI2023)图文安装教程

Adobe Illustrator2023(AI2023)简称AI,是一种应用于出版、多媒体和在线图像的工业标准矢量插画的软件。该软件主要应用于印刷出版、海报书籍排版、专业插画、多媒体图像处理和互联网页面的制作等,也可以为线稿提供较高的精度和控制,适合生产任…

【Camunda】 -- Docker 安裝及使用

【Camunda】 -- Docker 安裝及使用1. Docker install Camunda platform1.1 Web2. Big Data -- Postgres1.1 Big Data -- Postgres3.Awakening1.1 Big Data -- PostgresCamunda platform 是一個任務監控的平台。 Camunda Modeler是建模工具。 1. Docker install Camunda platfor…

【超详细教程】解决libxxx.so: cannot open shared object file: No file or directory

一、参考资料 error while loading shared libraries的解决方案 libascend_hal.so: cannot open shared object file:No such…解决办法-云社区-华为云 (huaweicloud.com) 二、相关介绍 1. -lxxx.so命名 lxxx means lib lib-name .solc means libc.so, lltdl means lib…

C++学习从基础到高阶(基于黑马程序员教程)

视频链接:黑马程序员匠心之作|C教程从0到1入门编程,学习编程不再难(52个小时) C语言中文网:http://c.biancheng.net/cplus/ Visual Studio 2022 下载地址:https://visualstudio.microsoft.com/zh-hans/downloads/ Visu…

软件设计模式 | 动态代理模式

文章目录一、动态代理概述1.1 代理的概述和作用1.2 动态代理的优点1.3 代理对象的创建1.4 代理对象调用方法的执行流程二、动态代理举例2.1 歌手经纪人2.2 业务功能的性能统计2.3 动态代理在 Spring 框架中的应用三、基于子类的动态代理一、动态代理概述 1.1 代理的概述和作用…