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

思维导图

在这里插入图片描述


最后

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

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

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

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

相关文章

4.类,方法,对象

1.1.2. 面向对象程序设计的三大特征 1.1.2.1. 封装 面向对象编程核心思想之一就是将数据和对数据的操作封装在一起,形成一般的概念,比如类的概念。 1.1.2.2. 继承 继承体现了一种先进的编程模式。子类可以继承父类的属性和方法。 1.1.2.3. 多态 多…

Day 44 Ansible自动化运维

Ansible自动化运维 几种常用运维工具比较 ​ Puppet ​ —基于 Ruby 开发,采用 C/S 架构,扩展性强,基于 SSL,远程命令执行相对较弱ruby ​ SaltStack ​ —基于 Python 开发,采用 C/S 架构,相对 puppet 更轻量级,配置语法使用 YAML,使得配置脚本更简单 ​ Ansible ​ —基于 …

Python学习笔记12:进阶篇(一),类的相关知识

前言 在讲类之前,我们简单介绍一些Python的知识。这些知识在入门篇没讲,想学Python的,基本都对Python有基础的了解,但是今天开始的进阶知识,会涉及到一些Python的特性,所以在这里介绍一下。 Python是一种高…

C语言中的内存分配方式(静态分配、动态分配)定义以及区别

在C语言中,内存分配主要有两种方式:静态分配(Static Allocation)和动态分配(Dynamic Allocation)。这两种方式在程序运行时对内存的管理和使用有着不同的特点和用途。 1. 静态分配(Static Allo…

Unity2D游戏制作入门 | 13 ( 之人物三段攻击 )

上期链接:Unity2D游戏制作入门 | 12(之人物受伤和死亡的逻辑动画)-CSDN博客 上期我们聊了人物的受伤和死亡的逻辑和动画,我们主要学习了事件的执行,即我们在人物受伤时可能会触发很多的事件,比如触发人物受伤的动画以及播放音乐等…

LabVIEW电表改装与校准仿真系统

LabVIEW开发的电表改装与校准仿真实验平台不仅简化了传统的物理实验流程,而且通过虚拟仿真提高了实验的效率和安全性。该平台通过模拟电表改装与校准的各个步骤,允许学生在没有实际硬件的情况下完成实验,有效地结合了理论学习和实践操作。 项…

计算机组成原理(三)

文章目录 只读存储器和闪速存储器ROM 只读存储器光擦可编程只读存储器(EPROM) 闪速存储器 并行存储器双端口存储器多模块交叉存储器定量分析 相联存储器 只读存储器和闪速存储器 ROM 只读存储器 ROM ,只能读出不能写入,最大的优点是不易失性。 光擦可编程只读存储器…

Spring Security+Spring Boot实现登录认证以及权限认证

基本概念 “Authentication(认证)”是spring security框架中最重要的功能之一,所谓认证,就是对当前访问系统的用户给予一个合法的身份标识,用户只有通过认证才可以进入系统,在物理世界里,有点类似于“拿工卡刷门禁”的…

homework 2024.06.17 math, UI

A的宽度225 B的宽度150 这样画出来就比较标准, 225 * 2 150 * 3 2A 3B

【排序算法】希尔排序详解(C语言)

文章目录 前言希尔排序的原理原理思路 代码实现希尔排序的相关问题效率算法稳定性 前言 为什么会有希尔排序,要从插入排序说起,希尔排序一开始设计出来是为了改进插入排序,因为插入排序在处理大量数据时效率不高,特别是对于近乎有…

【MySQL】MySQL数据库基础|数据库的操作|常用数据类型|表的操作

目录 一、数据库的操作(针对“数据集合”的操作) 1.显示当前的数据库 2.创建数据库 3.使用数据库 4.删除数据库 二、常用数据类型 1.数值类型 2.字符串类型 3.日期类型 三、表的操作 1.列出当前数据库的表 2.创建表 3.查看表结构 4.删除表…

11.5.k8s中pod的调度-cordon,drain,delete

目录 一、概念 二、使用 1.cordon 停止调度 1.1.停止调度 1.2.解除恢复 2.drain 驱逐节点 2.1.驱逐节点 2.2.参数介绍 2.3.解除恢复 3.delete 删除节点 一、概念 cordon节点,drain驱逐节点,delete 节点,在对k8s集群节点执行维护&am…

CesiumJS【Basic】- #006 浏览器控制台查看位置角度

文章目录 浏览器控制台查看位置角度1 目标 浏览器控制台查看位置角度 1 目标 浏览器控制台查看位置角度

【ai】pycharm 配置直接运行远程代码

Jetbrains Gateway适合远程开发机比较固定的情况。 【ai】pycharm远程ssh开发 这种实际是本地代码同步过去跑。 类似vs 也是这样的 但是vscode 是直接远程访问,远程编辑并运行。 pycharm 看起来也是支持的。 就是麻烦一点。 参考这里 主要参考这位大神的:python开发之远程开发…

在 React 中使用 ArcGIS JavaScript SDK 构建地图应用

创建React工程 $ npx install -g create-react-app $ create-react-app my-react-arcgis-app $ cd my-react-arcgis-app $ npm start安装ArcGIS库 $ npm install arcgis/core创建ArcGIS地图组件 import React, { useEffect, useRef } from react; import Map from arcgis/co…

Vue3源码【二】—— watch侦听computed计算属性原理及简单实现

1、watch监听器 1.1、使用watch watch 需要侦听特定的数据源,并在单独的回调函数中执行副作用,然后下面就是使用watch的一个说明。 小声逼逼:我还是习惯用监听,后面的监听也就是侦听。 /*** param source 监听对象* …

KVB:怎么样选择最优交易周期?

摘要 在金融交易中,周期的选择是影响交易成败的重要因素之一。不同的交易周期对应不同的市场环境和交易策略,选择合适的周期可以提高交易的成功率。本文将详细探讨交易中如何选择最优周期,包括短周期、中周期和长周期的特点及适用情况&#…

软考系统规划与管理师伴读脑图第9章

周末发系统规划与管理师的试听视频,占用了发送次数,所以上周的脑图推迟了今天发出。 不知不觉已经发到了第9章,感叹这就是坚持积累下来的力量,其实考试也是一样的道理。

c++深拷贝、浅拷贝

在 C 中,深拷贝和浅拷贝是两个重要的概念,尤其在涉及动态内存分配和指针成员时。这两个概念描述了对象复制时的行为。 浅拷贝 浅拷贝是指复制对象时,仅复制对象的基本数据成员,对于指针成员,只复制指针地址&#xff…

Python面试题-1

1. 什么是Python? Python 是一种高级编程语言,由 Guido van Rossum 在 1989 年创立,旨在强调代码的可读性和简洁性。Python 是一种解释型语言,这意味着开发过程中没有必要先将程序编译成机器语言,而是直接运行源代码。…