一文带你吃透数据库的约束,不做CRUD程序员

news2025/7/10 6:19:49

在这里插入图片描述在SQL标准中,一共规定了6种不同的约束,包括非空约束,唯一约束和检查约束等,而在MySQL中是不支持检查约束的,所以这篇文章先对其余5种约束做一个详解和练习。


文章目录

  • 1. 约束的概念
  • 2. 约束的分类
  • 3. 非空约束
  • 4. 唯一约束
  • 5. 主键约束
  • 6. 默认约束
  • 7. 外键约束
  • 7. 约束的案例练习

1. 约束的概念

约束是作用于表中列上的规则,用于限制加入表的数据。例如,作为主键的列一定是非空的唯一的,否则将无法对数据进行区分。约束的存在保证了数据库中数据的正确性、有效性和完整性。所以约束在数据库设计中是非常重要的。

2. 约束的分类

前面说到SQL标准把约束分为了6大类,分别是非空约束,唯一约束,主键约束,检查约束,默认约束和外键约束,添加约束时我们只需要在SQL中添加关键词,便可以限制表中的数据。

约束类型功能
非空约束 NOT NULL保证列中所有的数据不能有null值
唯一约束 UNIQUE保证列中所有数据各不相同
主键约束 PRIMARY KEY主键是一行数据的唯一标识,要求非空且唯一
检查约束 CHECK保证列中的值满足某一条件
默认约束 DEFAULT保存数据时,未指定值则采用默认值
外键约束 FOREIGN KEY外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

3. 非空约束

目的:保证列中所有的数据不能有null值

添加约束:

CREATE TABLE 表名(
	列名 数据类型 NOT NULL,);

建完表后添加非空约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型 NOT NULL;

删除约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型;

4. 唯一约束

目的:保证列中所有数据各不相同

添加约束:

CREATE TABLE 表名(
	列名 数据类型 UNIQUE [AUTO_INCREMENT],
	-- AUTO_INCREMENT: 当不指定值时自动增长);

CREATE TABLE 表名(
	列名 数据类型,[CONSTRAINT] [约束名称] UNIQUE(列名)
);

建完表后添加唯有约束:

ALTER TABLE 表名 MODIFY 字段名 数据类型 UNIQUE;

删除约束:

ALTER TABLE 表名 DROP INDEX 字段名;

5. 主键约束

目的:主键是一行数据的唯一标识,要求非空且唯一

添加约束:

CREATE TABLE 表名(
	列名 数据类型 PRIMARY KEY [AUTO_INCREMENT],);

CREATE TABLE 表名(
	列名 数据类型,
	[CONSTRAINT] [约束名称] PRIMARY KEY(列名)
);

建完表后添加主键约束:

ALTER TABLE 表名 ADD PRIMARY KEY(字段名);

删除约束:

ALTER TABLE 表名 DROP PRIMARY KEY;

6. 默认约束

目的:保存数据时,未指定值则采用默认值

添加约束:

CREATE TABLE 表名(
	列名 数据类型 DEFAULT 默认值,);

建完表后添加默认约束:

ALTER TABLE 表名 ALTER 列名 SET DEFAULT 默认值;

删除约束:

ALTER TABLE 表名 ALTER 列名 DROP DEFAULT;

7. 外键约束

当我们添加了外键以后,就在数据库层面建立了两张表的关系。

目的:外键用来让两个表的数据之间建立链接,保证数据的一致性和完整性

添加约束:

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

建完表后添加外键约束:

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

删除约束:

ALTER TABLE 表名 DROP FOREIGN KEY 外键名称;

7. 约束的案例练习

首先,我们使用以下的案例来练习约束:

-- 删除stu表
drop table if exists stu;
-- 创建stu表
CREATE TABLE stu (
id int primary key, -- 编号 主键
name varchar(10)  not null unique, -- 姓名 非空,唯一
age int not null, -- 年龄 非空
gender varchar(5) not null, -- 性别 非空
math double(5,2) not null, -- 数学成绩  非空
english double(5,2) default 0 -- 英语成绩 默认为0
);

在这里插入图片描述

验证主键约束,其特点是非空且唯一,先添加一条数据:

insert into stu(id,name,age,gender,math,english) values(1,'小张',23,'男',66,78);

添加第二条数据时,尝试 id 添加为空值:

insert into stu(id,name,age,gender,math,english) values (null,'小李',20,'女',98,87);

在这里插入图片描述

尝试 id 添加为重复的值:

insert into stu(id,name,age,gender,math,english) values (1,'小陈',55,'男',56,77);

在这里插入图片描述我们已经验证了主键约束,当我们添加不合法的数据时,添加失败。

验证非空约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math,english) values (2,NULL,20,'女',76,65);

在这里插入图片描述
验证唯一约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math,english) values 
(5,'小张',20,'男',86,NULL);

在这里插入图片描述验证默认约束:

当我们添加以下的数据时:

insert into stu(id,name,age,gender,math) values (6,'小赵',23,'男',99);

在这里插入图片描述

验证外键约束:

我们使用一下的案例来验证外键约束:

-- 删除表
DROP TABLE IF EXISTS emp;
DROP TABLE IF EXISTS dept;
-- 部门表
CREATE TABLE dept(
id int primary key auto_increment,
dep_name varchar(20),
addr varchar(20)
);
-- 员工表
CREATE TABLE emp(
id int primary key auto_increment,
name varchar(20),
age int,
dep_id int,
-- 添加外键 dep_id,关联 dept 表的id主键
CONSTRAINT fk_emp_dept FOREIGN KEY(dep_id) REFERENCES dept(id)
);

此时,我们在员工表中添加了外键,相当于在数据库层面上建立了两张表的关系,此时如果员工表中有员工 a ,他属于 1 号部门,那么我们想要删除部门表中的 1 号部门就会删除失败,因为员工 a 是属于 1 号部门的,此时两张表建立了关系。

在这里插入图片描述添加数据:

-- 添加 2 个部门
insert into dept(dep_name,addr) values
('研发部','西安'),('销售部', '成都');
-- 添加员工,dep_id 表示员工所在的部门
INSERT INTO emp (NAME, age, dep_id) VALUES
('张三', 20, 1),
('李四', 20, 2);

此时想要是删除销售部门时,发现删除失败。

在这里插入图片描述

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

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

相关文章

.net 大型物流综合管理网络平台源码【免费分享】

淘源码:国内专业的免费源码下载平台 源码分享,需要源码学习可私信我! 一、源码描述 这是一款大型的物流综合管理网络平台源码,十分完整实用,便于调试,涵盖了物流综合管理的全面内容,该源码运行比…

单商户商城系统功能拆解30—营销中心—积分签到

单商户商城系统,也称为B2C自营电商模式单店商城系统。可以快速帮助个人、机构和企业搭建自己的私域交易线上商城。 单商户商城系统完美契合私域流量变现闭环交易使用。通常拥有丰富的营销玩法,例如拼团,秒杀,砍价,包邮…

【负荷预测】基于改进灰狼算法(IGWO)优化的LSSVM进行负荷预测(Matlab代码实现)

📝个人主页:研学社的博客 💥💥💞💞欢迎来到本博客❤️❤️💥💥 🏆博主优势:🌞🌞🌞博客内容尽量做到思维缜密,…

IDEA 中Git 多次 Commit 合并为一次提交

一、背景 由于个人习惯的原因,喜欢一个功能分多次提交,导致很多提交比较零碎。 有时候经常需要将零碎的提交合并成一次,该怎么办? 可以使用 IDEA 自带的 Git 插件 将多次 Commit 合并成一次。 二、问题描述 如希望将第二次到第…

新品上市 | “电子表格软件”轻装上阵,企业报表用户的新选择

2022年11月14日,恰逢思迈特软件11周年的生日,我们更新了电子表格软件(Smartbi Spreadsheet),希望在一站式BI产品之外,更多的企业用户可以通过成熟、可控、小巧、灵活的报表工具,提升数据化管理的…

分击合进,锦江之星酒店与白玉兰酒店再领投资热潮

2022年11月11日,「山水画中游,暇享好时光」品牌品鉴会在广西桂林隆重召开。锦江酒店(中国区)旗下两大酒店品牌锦江之星酒店和白玉兰酒店携手亮相本次活动。 (品牌矩阵品鉴会活动现场) 后疫情时代&#xff…

JDBC编程的基本流程

文章目录1、创建数据源2、让代码和数据源建立连接3、操作数据库3.1 插入操作3.2 删除操作3.3 修改操作3.4 查找操作1、创建数据源 创建DataSource对象,这个对象描述了数据库服务器在哪,需要导入包javax.sql.DataSource DataSource databases new Mysq…

【第006篇】通过impdp命令导入dmp文件到Oracle11g数据库中

准备:按照dmp文件的账号密码,如 gwpc/gwpc 创建好表空间、用户等信息。 1、执行以下命令获取DATA_PUMP_DIR的值。 select * from dba_directories;2、将上图圈主的那个路径复制出来备用:/opt/oracle/app/admin/orcl/dpdump/ 3、将dmp文件放…

3.35 OrCAD中怎么产生Cadence Allegro的第一方网表?OrCAD软件输出Cadence Allegro第一方网表报错时应该怎么处理?

笔者电子信息专业硕士毕业,获得过多次电子设计大赛、大学生智能车、数学建模国奖,现就职于南京某半导体芯片公司,从事硬件研发,电路设计研究。对于学电子的小伙伴,深知入门的不易,特开次博客交流分享经验&a…

从0开始搭建ELK日志收集系统

Elasticsearch elasticsearch是一个高度可扩展全文搜索和分析引擎,基于Apache Lucene 构建,能对大容量的数据进行接近实时的存储、搜索和分析操作,可以处理大规模日志数据,比如Nginx、Tomcat、系统日志等功能。 Logstash 数据收…

一周侃 | 周末随笔

前言 明天又是周一了,感慨时间过得真快,2022年只差一个月就要过去了。大家年初定的目标实现了吗【狗头】 作为一个技术类博主,我平常除了看专业书籍和论文之外,很喜欢看一些闲书,比如时政类、经济类、历史人文类、科…

linux 进程通信 C程序案例

linux 进程通信 C程序案例 编写C程序完成&#xff1a;父进程创建两个子进程&#xff0c;每个进程都在屏幕上显示自己的进程ID号&#xff0c;并在第1个子进程中加载执行一条外部命令。 #include <stdio.h> #include <unistd.h> #include <sys/types.h> #inc…

看5G时代,“一键喊话”的大喇叭如何奏响基层治理最强音

“喂喂&#xff0c;各位居民朋友快下楼做核酸啦……” 通过广播传递最新政策、应急预警、疫情防控等信息&#xff0c;利用智能信息播报系统&#xff0c;打通基层宣讲“最后一公里”&#xff0c;已成为全国多地的常见景象。“多亏了它&#xff0c;需要紧急通知的时候&#xff0c…

Vue--》超详细教程——vue-cli脚手架的搭建与使用

目录 vue-cli vue-cli 的安装 (可能出现的问题及其解决方法) vue-cli 创建 Vue 项目 Vue项目中目录的构成 Vue项目的运行流程 Vue组件的使用 vue-cli vue-cli是Vue.js开发的标准工具。它简化了程序员基于webpack创建工程化的Vue项目的工程。其好处就是简省了程序员花费时…

Nacos——配置中心源码详解

Nacos——配置中心源码详解配置中心客户端主动获取客户端服务端客户端长轮询更新客户端1.入口2.配置文件分片处理3.配置文件处理4.本地配置文件与缓存数据的对比5.开启长轮询与服务端对比6.通知监听器7.监听回调处理服务端1.入口2.长轮询机制3.长轮询的延迟任务4.数据变更事件总…

【U8+】用友U8同一个账套使用了好多年,需要将以前年度进行分离、删除。

【问题需求】 用友U8一个账套使用了好多年了&#xff0c; 需要将以前年度进行删除&#xff0c; 但是在系统管理中&#xff0c;查看该账套只有一个年度账&#xff08;账套库&#xff09;。 例如&#xff1a; 图中002账套&#xff0c;是从2020年开始使用至2024年&#xff0c; 现在…

SpringBoot集成Spring Security——【认证流程】

一、认证流程 上图是 Spring Security 认证流程的一部分&#xff0c;下面的讲解以上图为依据。 &#xff08;1&#xff09; 用户发起表单登录请求后&#xff0c;首先进入 UsernamePasswordAuthenticationFilter&#xff1a; 在 UsernamePasswordAuthenticationFilter中根据用户…

第十四届蓝桥杯模拟赛第一期试题【Java解析】

目录 A 二进制位数 问题描述 答案提交 参考答案 解析 B 晨跑 问题描述 答案提交 参考答案 解析 C 调和级数 问题描述 答案提交 参考答案 解析 D 山谷 问题描述 答案提交 参考答案 解析 E 最小矩阵 问题描述 答案提交 答案 解析 F 核酸日期 问题描述…

香港和新加坡,谁是亚洲加密金融中心?

去新加坡&#xff0c;还是去中国香港? 对中国Web3的创业者来说&#xff0c;是一个问题。 2022年11月&#xff0c;中国香港金融科技周和新加坡金融科技周同时举办&#xff0c;将这场竞赛推向高潮。 抢人、抢钱、抢公司……中国香港和新加坡对于“加密金融中心”或者“全球We…

2、云原生微服务实践-服务开发框架设计和实践

目录 一、依赖管理 二、服务模块管理 api、svc 三、其他文件管理 1、私密配置文件 2、前端页面单页文件 四、单体仓库 mono-repo 1、单体仓库和多仓库的对比&#xff1a; 2、单体仓库优点 五、接口参数校验 六、统一异常处理 七、DTO(数据传输对象)和DMO(数据模型对…