mysql操作 sql语句中的完整性约束有哪些,主键约束、外键约束、引用完整性约束,主键外键、唯一性

什么是约束:约束:就是约定哪些东西能填、怎么填?哪些东西不能填?

文章目录

      • 前言:建表
      • 正文
      • 一、实体完整性约束
        • 1. 主键约束
        • 2. 唯一性约束
        • 3. 自增长约束
        • 4. 联合主键约束
      • 二、域完整性约束
      • 三、引用完整性约束
        • 1. 外键约束

讲约束一般是在创建表时,对字段名进行约束,所以这里先讲如何创建表:

前言:建表

语法:

create table 表名(
    字段名1 数据类型 [约束],
    字段名2 数据类型 [约束],
    ...    -- 最后一个不写,逗号
);

正文

一、实体完整性约束

在这里插入图片描述

1. 主键约束

主键:所有字段中唯一标识的一个字段。特点:非空、唯一,一张表只能有一个主键

分类:

  • 自然主键:使用表中的字段作为主键(比如:身份证号)
  • 代理主键:自定义一个字段来作为主键(这个用的多,比如:id)

语法:主要是在上面创建表中的 [约束] 处使用:字段名 数据类型 primary key

2. 唯一性约束

这一列的数据值要唯一(比如注册的时候,用户名不重复,但是 null 不算重复)语法为:字段名 数据类型 unique;

3. 自增长约束

一般自增长加在主键上,语法:字段名 数据类型 primary key auto_increment

举例:

-- 假如插入的时候不写字段名怎么办?比如:
insert into user values('张三',30);
-- 那我们知道不写字段名时,所有都需要赋值,那id怎么赋值,id是自增长的,但是我又必须赋值,怎么办,直接赋 null。但主键不能为null,所以这里的null相当于就是占位的作用
4. 联合主键约束

多个字段组成的主键。联合主键没有自增长。语法:primary key(字段名1,字段名2,...)

create table user(
	name varchar(20),
    age int,
    primary key(name,age)
)

二、域完整性约束

域:就是表中的某一个单元格,对格子的约束。

1、非空约束:字段名 数据类型 not null

2、数据类型约束:类型要匹配

3、默认值约束:字段名 数据类型 default 默认值。如果给了值,就用你的值,没有就是默认值

三、引用完整性约束

上面两种约束都是在单表中实现的,而现在多张表怎么办?
引用:一张表关联另一张表,两张表之间有引用关系。

1. 外键约束

实际开发中,如果能用逻辑外键(就是你认为这两张表有关系就行了),就不要添加外键约束。比如:

create table emp(
	empno int primary key,
    ename varchar(30),
    job varchar(30),
    salary double,
);
create table dept(
	deptno int primary key,
    dname varchar(30),
    location varchar(30)
)

① 上面这两张表没有任何关系,那如何加关系?----> **外键:**在一个表中加字段指向另一个表的主键。如:在 emp 中加:deptno int

② 在实际开发中,这样写已经足够了。因为表虽然没有外键约束,但有关系了,这就叫做逻辑外键

那外键约束怎么写呢?

create table emp(
	empno int primary key,
    ename varchar(30),
    job varchar(30),
    salary double,
    deptno int,
    constraint fk_emp_dept foreign key(deptno) references dept(deptno)
)

fk_emp_dept:就是外键约束的名字。随便命名,一般是前面加 fk,emp_dept 就是哪个表指向哪个表。

foreign key(deptno):deptno 参数,就是指定哪个字段当外键。

references dept(deptno):dept 是外键指向哪个表。括号里面的参数就是 dept 表中的主键。

外键约束需要注意:主表(外键指向的表叫做主表),从表(有外键的表叫做从表)

  • 主表有的,从表可以没有;但从表有的,主表必须要有。

    比如:添加(修改)数据

    insert into dept (deptno,dname,location) values(10,'研发部','金融港');   
    -- 正常运行
    
    insert into emp (empno,ename,job,salary,deptno) values(2023,'张三','java开发','20000',20);
    -- 报错
    

在这里插入图片描述

  • 删除主表的时候,要保证从表中没有

    比如:删除

    delete from dept where deptno = 10;
    
    -- 假如从表emp中有在部门10的员工,则删除失败,否则可以删除
    

这就是外键约束的原因,所以一般都是逻辑外键

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

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

相关文章

【kerberos】使用 curl 访问受 Kerberos HTTP SPNEGO 保护的 URL

前言: 大数据集群集成 Kerberos 后,很多 WEBUI 打开都会提示输入用户名和密码。由于我想获取 flink 任务的详情,且KNOX 并不支持Flink api,查看KNOX 直接的列表:https://docs.cloudera.com/cdp-private-cloud-base/7.…

算法实战:亲自写红黑树之二 完整代码

此文承接:算法实战:亲自写红黑树之一-CSDN博客 目录 一、项目结构 二、辅助代码a.h 三、红黑树代码rbtree.h 四、测试代码main.cpp 五、运行效果 六、代码详解 一、项目结构 这里给出的代码是实际可以运行的代码。 运行环境:VS2022&am…

波束形成中的主瓣宽度

阵列信号处理相关基础知识及主瓣宽度 导向矢量阵列方向图确知波束形成普通波束形成主瓣宽度确知波束形成主瓣宽度普通波束形成主瓣宽度 在讨论主瓣宽度之前,首先得了解导向矢量、波束形成、阵列方向图的概念,这些是阵列信号处理中最基础的知识。 导向矢量…

编译智能合约以及前端交互工具库(Web3项目一实战之三)

我们已然在上一篇 Web3项目灵魂所在之智能合约编写(Web3项目一实战之二) ,为项目写好了智能合约代码。 但身为开发人员的我们,深知高级编程语言所编写出来的代码,都是需要经过编译,而后外部方能正常调用。很显然,使用solidity这门新的高级编程语言编写出来的智能合约,也…

【机器学习】线性回归算法:原理、公式推导、损失函数、似然函数、梯度下降

1. 概念简述 线性回归是通过一个或多个自变量与因变量之间进行建模的回归分析,其特点为一个或多个称为回归系数的模型参数的线性组合。如下图所示,样本点为历史数据,回归曲线要能最贴切的模拟样本点的趋势,将误差降到最小。 2. 线…

基于旗鱼算法优化概率神经网络PNN的分类预测 - 附代码

基于旗鱼算法优化概率神经网络PNN的分类预测 - 附代码 文章目录 基于旗鱼算法优化概率神经网络PNN的分类预测 - 附代码1.PNN网络概述2.变压器故障诊街系统相关背景2.1 模型建立 3.基于旗鱼优化的PNN网络5.测试结果6.参考文献7.Matlab代码 摘要:针对PNN神经网络的光滑…

云表|低代码软件开发“外挂”,新时代的黑科技

随着技术的日新月异,现代企业对于软件开发的需求愈加迫切,传统的软件开发方式已然无法满足快速迭代和创新的需求。在这种背景下,低代码开发平台如破茧而出,应运而生。这种平台通过提供可视化的开发工具和预构建的组件,…

NVIDIA安装

电脑显卡类型 两种方法: 选择对应的版本 产品系列下载Notebooks,这样产品才会出现Laptop的GPU(Laptop是代表笔记本)。 下载完之后双击安装,更改下载路径后,选择默认的下载即可。 卸载 如果之后要卸载…

Spring6(三):面向切面AOP

文章目录 4. 面向切面:AOP4.1 场景模拟4.1.1 声明接口4.1.2 创建实现类4.1.3 创建带日志功能的实现类4.1.4 提出问题 4.2 代理模式4.2.1 概念4.2.2 静态代理4.2.3 动态代理4.2.4 测试 4.3 AOP概念4.3.1 相关术语①横切关注点②通知(增强)③切…

chrome 浏览器个别字体模糊不清

特别是在虚拟机里,有些字体看不清,但是有些就可以,设置办法: chrome://settings/fonts 这里明显可以看到有些字体就是模糊的状态: 把这种模糊的字体换掉即可解决一部分问题。 另外,经过观察,…

Neuro-Oncology | IF:15.9 CUTTag和RNA-seq联合解析胶质母细胞瘤的耐药性

发表单位:德克萨斯大学圣安东尼奥分校 发表日期:2023年1月18日 期 刊:Neuro-Oncology(IF: 15.9) 研究技术:CUT&Tag-seq、RNA-seq、RT-qPCR(爱基百客均可提供) 2023年1月1…

如何在10亿级别用户中检查用户名是否存在?

题目 不知道大家有没有留意过,在使用一些app注册的时候,提示你用户名已经被占用了,需要更换一个,这是如何实现的呢?你可能想这不是很简单吗,去数据库里查一下有没有不就行了吗,那么假如用户数量…

【人工智能实验】A*算法求解8数码问题 golang

人工智能经典问题八数码求解 实际上是将求解转为寻找最优节点的问题,算法流程如下: 求非0元素的逆序数的和,判断是否有解将开始状态放到节点集,并设置访问标识位为true从节点集中取出h(x)g(x)最小的节点判断取出的节点的状态是不…

Redis - 订阅发布替换 Etcd 解决方案

为了减轻项目的中间件臃肿,由于我们项目本身就应用了 Redis,正好 Redis 的也具备订阅发布监听的特性,正好应对 Etcd 的功能,所以本次给大家讲解如何使用 Redis 消息订阅发布来替代 Etcd 的解决方案。接下来,我们先看 R…

linux之shell

一、是什么 Shell是一个由c语言编写的应用程序,它是用户使用 Linux 的桥梁。Shell 既是一种命令语言,又是一种程序设计语言 它连接了用户和Linux内核,让用户能够更加高效、安全、低成本地使用 Linux 内核 其本身并不是内核的一部分&#x…

Java实现自定义windows右键菜单

要添加Java应用程序到Windows桌面的右键菜单,可以按照以下步骤操作: 创建一个新的.reg文件,并在文本编辑器中打开它。 添加以下代码到.reg文件中,将名称和路径替换为您的Java应用程序的名称和路径。 Windows Registry Editor V…

虚拟化热添加技术在数据备份上的应用

虚拟化中的热添加技术主要是指:无需停止或中断虚拟机的情况下,在线添加物理资源(如硬盘、内存、CPU、网卡等)的技术。热添加技术也是相比物理机一个非常巨大的优势,其使得资源分配变得更加灵活。 虚拟化中的热添加技术…

SOP作业指导书系统如何帮助厂家实现数字化转型

SOP(Standard Operating Procedure,标准操作程序)电子作业操作手册的应用对于厂家实现数字化转型起着至关重要的作用。本文将探讨SOP电子作业操作手册如何帮助厂家实现数字化转型的重要性和优势。 首先,SOP作业指导书可以提高生产…

idea菜单栏任务栏放缩比例修改

在编辑自定义VM选项中增加 -Dide.ui.scale0.8 参数 Help -> Edit Custom VM Options