MySQL约束详解:构建数据完整性基石

目录

  • MySQL约束
    • 1.1 约束
    • 1.1 数据类型
    • 1.2 主键约束[`重要`]
    • 1.3 自增约束
    • 1.4 唯一约束
    • 1.5 非空约束
    • 1.6 默认值
        • 代码演示
    • 1.7 外键约束[了解]
    • 思维导图
    • 最后

MySQL约束

  • MySQL作为广泛使用的开源关系型数据库管理系统,其强大的数据约束功能对于维护数据的一致性和准确性至关重要。

本文将深入探讨MySQL中的几种主要约束类型,以及如何在创建表时应用它们来确保数据的完整性。


1.1 约束

是什么? 约束,即限制,就是通过设置约束,可以限制对数据表数据的插入,删除,更新


怎么做?

约束设置的语法,大部分是

create table 表名(
字段 数据类型(长度) 约束,
字段 数据类型(长度) 约束
);

另外一种是建表后,使用alter语句修改表添加约束

1.1 数据类型

其实数据类型也是一种约束,例如设置id列为int类型,那就不能乱给id设置字符串或者日期等数据

1.2 主键约束[重要]

主键(primary key)约束非常重要,以后开发中基本上每张表都要有主键约束,作用是设置了主键约束的列,有以下效果

  • 不能为空
  • 不能重复

一般主键是给id设置的

设置主键方式有四种:

  • 在建表时给列直接指定
  • 在建表语句的最后指定某一列是主键
  • 给以建好的表修改设置主键
  • 图形化操作
-- ============= 演示主键约束 =============
-- 方式1:建表时指定主键
create table tb_a(
 id int primary key,-- 主键
 name varchar(20)
)
-- 不插入主键会报错(主键不能为空)
insert into tb_a (name) value ("aaa");
-- 插入2遍也报错(主键不能重复)
insert into tb_a (id,name) value (1,"aaa");
-- 方式2:建表时指定主键(放在下面指定主键)
create table tb_b(
 uid int,
 oid int,
 name varchar(20),
 primary key(uid,oid) -- 一般用于联合主键
)
-- 联合主键是两个列都重复才算重复
-- 方式3: 建表后通过修改设置主键
alter table stu add primary key (sid);
-- 方式4: 图形化操作

在这里插入图片描述

1.3 自增约束

自增(auto_increment)约束,主要是配合主键使用,防止主键为空,重复

-- ================= 主键自增 =================
create table tb_c(
id int primary key auto_increment,-- 主键自增
name varchar(20)
)
-- 插入时不插入主键,主键为自动赋值
-- 多插入几次,主键会自增
insert into tb_c (name) values ("cccc");
-- 删除一个
delete from tb_c where id = 4;
-- 再插入,自增顺序是不会回退,继续递增

在这里插入图片描述

1.4 唯一约束

  • 定义:确保该列中的所有值都是唯一的,但允许有一个NULL值。
  • 应用场景:用于需要唯一标识符但不作为主键的场景,如用户的电子邮件地址。
  • 示例:
-- ================= 唯一自增 =================
create table tb_d (
 id int,
 name varchar(20) unique -- 唯一约束
);
-- 插入name列,重复值会报错
insert into tb_d (id,name) values (1,"d");

-- 唯一约束也是唯一索引(索引,数据库高级知识常用于优化sql,提高查询速度)

在这里插入图片描述

1.5 非空约束

  • 定义:非空约束要求被标记的列不能包含NULL值。
  • 应用场景:适用于那些必须有值的字段,如用户姓名、电子邮件地址等。
  • 示例:
-- ================= 非空 =================
create table tb_e(
 id int,
 name varchar(20) not null -- 非空
);
-- 正常插入可以
insert into tb_e values (1,"eee")
-- 不插入name列,name为空会报错,因为约束为非空
insert into tb_e (id) values (2)

在这里插入图片描述

1.6 默认值

默认值(default),给列设置默认值约束后,如果该列在插入数据时没有给值,就自动赋值默认值

-- ================= 默认值 =================
create table tb_f(
 id int,
 sex char(1) default "男" -- 默认值
);
-- 插入数据,不指定性别,填充默认值
insert into tb_f (id) value (1)

在这里插入图片描述

代码演示
/*
设计表,添加约束
  1.数据类型也属于一种约束
  2.主键约束 primary key
	设置主键的字段:
	    不能为空
	    不能重复
	四种方式:
	1建表时在字段(列)后面直接添加
	2建表时在最后添加
	3建表完成后,利用update设置
	4利用软件图形化设置
  3.自增约束 auto_increment
	语法:字段(列)后设置
	主要配合主键使用(防止主键为空,重复)
  4.唯一约束 unique
	语法:字段(列)后设置
	作用:字段值不能重复,唯一性
  5.非空约束 not null
	语法:字段(列)后设置
	作用:字段值不能为空
  6.默认约束 default 
	语法:default 默认值
	作用:没有主动设置字段值时,系统默认赋值默认值
*/

-- 创建学生表 student
create table student(
-- 设置主键约束,配合自增约束使用
  sid int primary key auto_increment, 
  sname varchar(10),
-- 设置默认值
  age int default 18 
);
insert into student(sname) values ("王五");
insert into student(sname) values ("李四");
-- 建表时在最后添加主键
create table student2(
  sid int,
  oid int,
-- 设置唯一约束
  sname varchar(10) unique,
  sage int default 18,
-- 一般用于联合主键
  primary key(sid,oid)
);
insert into student2(sname) values ("张三");
-- 插入相同名字
insert into student2(sname) values ("张三");
-- 错误代码:1364 Field 'sid' doesn't have a default value


在这里插入图片描述

1.7 外键约束[了解]

外键,是多表之间接的一种关联关系的一种限制.

语法

constraint 外键名 foreign key (当前表中的列名) references(主键);

设计订单表和商品表,订单表的数据要关联商品表数据

-- 商品表
create table tb_goods(
 gid int primary key,
 gname varchar(20),
 descr varchar(20)
);

-- 订单表 (订单表关联了商品表)
create table tb_order(
 oid int primary key,
 order_time datetime,
 gid int,
 -- 设置外键
 constraint fk_order_goods foreign key(gid) references tb_goods(gid)
);
/*
 被引用的表称为父表 parent , tb_goods
 引用别人的表称为子表 child , tb_order
*/
-- 给父表随便插入数据
insert into tb_goods values (2,'键盘','敲代码没有bug');
-- 给子表随便插入数据不行!! 这个数据得是父表中有的才行
insert into tb_order values (1,'2022-11-11',1);
-- 子表可以删除数据
delete from tb_order where oid = 1;

-- 父表被引用的数据不能删除
delete from tb_goods where gid = 2;
delete from tb_goods where gid = 1;

image-20230505165521214

思维导图

在这里插入图片描述


最后

如果感觉有收获的话,点个赞 👍🏻 吧。
❤️❤️❤️本人菜鸟修行期,如有错误,欢迎各位大佬评论批评指正!😄😄😄

💘💘💘如果觉得这篇文对你有帮助的话,也请给个点赞、收藏下吧,非常感谢!👍 👍 👍在这里插入图片描述

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

宋仕强论道之华强北假货

宋仕强论道之华强北假货,在华强北野蛮生长猥琐发育的那些年假货一度泛滥,就电子元器件来说,就有翻新(拆机)货、散新货、换标货、虚标货、也国产替代白牌货等几种主要的类型。今天我们来分析华强北假货初探之散新货&…

Windows环境部署MySQL_8.4.0 LTS的部署安装、验证连接以及卸载全过程实操手册

前言: 什么是 MySQL MySQL 是一个关系型数据库管理系统,由瑞典 MySQL AB 公司开发,目前属于Oracle 公司。MySQL 是一种关系型数据库管理系统,关系型数据库将数据保存在不同的表中,而不是将所有数据放在一个大仓库内&am…

IT入门知识第四部分《数据库》(4/10)

目录 1. 数据库基础 1.1 数据库的定义 1.2 数据库的关键概念 数据模型 数据库架构 数据库操作语言(DML 和 DDL) 总结 2. 关系型数据库 2.1 MySQL MySQL 的历史和特点 MySQL 的安装和配置 MySQL 的基本操作 2.2 PostgreSQL PostgreSQL 的特…

LabVIEW利用旋转编码器脉冲触发数据采集

利用旋转编码器发出的脉冲控制数据采集,可以采用硬件触发方式,以确保每个脉冲都能触发一次数据采集。本文提供了详细的解决方案,包括硬件连接、LabVIEW编程和触发设置,确保数据采集的准确性和实时性。 一、硬件连接 1. 旋转编码…

Linux搭建我的世界乌托邦探险之旅3.2整合包服务端,Minecraft开服教程

Linux服务器使用MCSM10 搭建 我的世界 乌托邦探险之旅3.2 整合包 服务端 的教程,Minecraft整合包开服教程。 大型养老探险整合包:乌托邦探险之旅3.2,探索上千种结构,造访丰富的自然群系,欣赏生动的生物动画&#xff0…

Android如何简单快速实现RecycleView的拖动重排序功能

本文首发于公众号“AntDream”,欢迎微信搜索“AntDream”或扫描文章底部二维码关注,和我一起每天进步一点点 要实现这个拖动重排序功能,主要是用到了RecycleView的ItemTouchHelper类 首先是定义一个接口 interface ItemTouchHelperAdapter …

MVC 框架安全

在现代 Web 开发中,使用 MVC 架构是一种流行的做法。MVC 是 Model-View-Controller 的缩写,它将 Web 应用分为三层,View 层负责用户视图、页面展示等工作;Controller 负责应 用的逻辑实现,接收 View 层传入的用户请求&…

代码随想录算法训练营第三十九天| 416. 分割等和子集

416. 分割等和子集 - 力扣&#xff08;LeetCode&#xff09; class Solution {public boolean canPartition(int[] nums) {int sum 0;for (int i0;i<nums.length;i){sum nums[i];}if(sum%2!0){return false;}int weight sum /2;// int[][] dp new int[nums.length][weig…

软件测试-第1章-绪论

目录 1.1软件危机和软件生存期 &#xff08;1&#xff09;软件危机 &#xff08;2&#xff09;软件生存周期 1.2软件测试的意义 1.3什么是软件测试 &#xff08;1&#xff09;软件测试的定义 &#xff08;2&#xff09;软件测试的范围 1.4怎样认识软件测试 1&#xff…

【包管理】Node.JS与Ptyhon安装

文章目录 Node.JSPtyhon Node.JS Node.js的安装通常包括以下几个步骤&#xff1a; 访问Node.js官网&#xff1a; 打开Node.js的官方网站&#xff08;如&#xff1a;https://nodejs.org/zh-cn/download/&#xff09;。 下载安装包&#xff1a; 根据你的操作系统选择对应的Node…

Go语言RPC开发深度指南:net/rpc包的实战技巧和优化策略

Go语言RPC开发深度指南&#xff1a;net/rpc包的实战技巧和优化策略 概览理解net/rpc的核心概念RPC的基本原理net/rpc的工作模式关键特性 快速开始准备RPC服务和客户端的基础环境构建一个基础的RPC服务端构建一个基础的RPC客户端 开发一个实际的RPC服务设计服务接口实现服务客户…

《Windows API每日一练》4.5 GDI映射模式

上一节讲述设置绘图模式时&#xff0c;包括设置背景模式、混合模式&#xff0c;还有一个就是映射模式。本节我们将详细讲述映射模式。 本节必须掌握的知识点&#xff1a; 设备坐标和逻辑坐标 视口和窗口 MM_TEXT映射模式 度量映射模式 自定义映射模式 第27练&#xff1a;GDI映…

打破安全设备孤岛,多源威胁检测与响应(XDR)如何构建一体化安全防线

在数字化和信息化迅猛发展的当下&#xff0c;安全设备孤岛现象成为网络安全治理中的一大挑战。在多元化的市场环境中&#xff0c;不同厂商的安全设备因数据格式与系统兼容性的差异&#xff0c;导致信息流通受阻、共享困难&#xff0c;形成孤立的安全防线。 安全设备孤岛现象不仅…

重构大学数学基础_week05_雅各比矩阵与雅各比行列式

这周来讲一下雅各比矩阵和雅各比行列式。 多元函数的局部线性属性 首先我们来回顾一下向量函数&#xff0c;就是我们输入一个向量&#xff0c;输出也是一个向量&#xff0c;我们假设现在有一个向量函数 这个函数意思就是在说&#xff0c;我们在原来的平面上有一个向量(x,y),经…

小米手机怎么用代理换ip:步骤详解与实用指南

在数字化时代&#xff0c;网络安全与隐私保护日益受到重视。对于小米手机用户而言&#xff0c;使用代理换IP已成为提升网络安全性、访问特定网站或绕过地域限制的有效手段。本文将详细介绍如何在小米手机上设置代理以更换IP地址&#xff0c;帮助用户更好地保护个人信息和享受更…

openEuler 24.03 LTS - 华为欧拉开源版(华为 RHEL 兼容发行版)

openEuler 24.03 LTS - 华为欧拉开源版&#xff08;华为 RHEL 兼容发行版&#xff09; 华为红帽企业 Linux 兼容发行版 请访问原文链接&#xff1a;https://sysin.org/blog/openeuler/&#xff0c;查看最新版。原创作品&#xff0c;转载请保留出处。 作者主页&#xff1a;sy…

6.17 作业

使用qt实现优化自己的登录界面 要求&#xff1a; 1. qss实现 2. 需要有图层的叠加 &#xff08;QFrame&#xff09; 3. 设置纯净窗口后&#xff0c;有关闭等窗口功能。 4. 如果账号密码正确&#xff0c;则实现登录界面关闭&#xff0c;另一个应用界面显示。 第一个源文件 …

【Netty】nio处理acceptreadwrite事件

&#x1f4dd;个人主页&#xff1a;五敷有你 &#x1f525;系列专栏&#xff1a;Netty ⛺️稳中求进&#xff0c;晒太阳 1.处理accept 1.1客户端代码 public class Client {public static void main(String[] args) {try (Socket socket new Socket("localhost…

泛微开发修炼之旅--19ecode获取用户人员信息方案汇总及代码示例(含pc端和移动端)

文章详情链接&#xff1a;19ecode获取用户人员信息方案汇总及代码示例&#xff08;含pc端和移动端&#xff09;

Web前端开发实战:HTML5+CSS3+JavaScript+Vue+Bootstrap

&#x1f482; 个人网站:【 摸鱼游戏】【神级代码资源网站】【工具大全】&#x1f91f; 一站式轻松构建小程序、Web网站、移动应用&#xff1a;&#x1f449;注册地址&#x1f91f; 基于Web端打造的&#xff1a;&#x1f449;轻量化工具创作平台&#x1f485; 想寻找共同学习交…