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.rhkb.cn/news/193610.html

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

相关文章

从程序员到架构师,实现技术巅峰的完美转型

文章目录 一、程序员到架构师的转型过程1. 技术知识的积累2. 设计和决策能力的提升3. 沟通和协调能力的锻炼4. 批判性思维和解决问题能力的培养5. 不断学习和创新的精神 二、转型中需要克服的困难和挑战1. 技术知识的广度和深度2. 设计和决策的难度和风险3. 沟通和协调的挑战4.…

OpenSign:安全可靠的电子签名解决方案 | 开源日报 No.76

microsoft/Web-Dev-For-Beginners Stars: 71.5k License: MIT 这个开源项目是一个为期 12 周的全面课程,由微软云倡导者团队提供。它旨在帮助初学者掌握 JavaScript、CSS 和 HTML 的基础知识。每一节都包括预习和复习测验、详细的书面指南、解决方案、作业等内容。…

Javaweb之Vue的概述

2.1 Vue概述 通过我们学习的htmlcssjs已经能够开发美观的页面了,但是开发的效率还有待提高,那么如何提高呢?我们先来分析下页面的组成。一个完整的html页面包括了视图和数据,数据是通过请求 从后台获取的,那么意味着我…

pycharm/vscode 配置black和isort

Pycharm blackd Pycharm中有插件可以实现后台服务运行black:BlackConnect 安装 配置 Pycharm isort pycharm中,isort没有插件,暂使用外部工具实现,外部工具也可添加快捷键实现快捷对文件、文件夹进行format import&#xff1…

promise时效架构升级方案的实施及落地 | 京东物流技术团队

一、项目背景 为什么需要架构升级 promise时效包含两个子系统:内核时效计算系统(系统核心是时效计算)和组件化时效系统(系统核心是复杂业务处理以及多种时效业务聚合,承接结算下单黄金流程流量)&#xff…

622.设计循环队列(LeetCode)

思路 先确定什么情况为空,什么情况为满。 这里有两种解决方案, 1.留一个空间空置,当rear1 front时 ,则队列为满 (这里我们选用方案一) 2.增加一个size变量记录数据个数,size 0则为空&#xff…

RabbitMQ之死信队列

文章目录 一、死信的概念二、死信的来源三、实战1、消息 TTL 过期2、队列达到最大长度3、消息被拒 总结 一、死信的概念 先从概念解释上搞清楚这个定义,死信,顾名思义就是无法被消费的消息,字面意思可以这样理解,一般来说&#x…

AI创作系统ChatGPT网站源码+详细搭建部署教程+支持DALL-E3文生图/支持最新GPT-4-Turbo-With-Vision-128K多模态模型

一、AI创作系统 SparkAi创作系统是基于OpenAI很火的ChatGPT进行开发的Ai智能问答系统和Midjourney绘画系统,支持OpenAI-GPT全模型国内AI全模型。本期针对源码系统整体测试下来非常完美,可以说SparkAi是目前国内一款的ChatGPT对接OpenAI软件系统。那么如…

010.cat、find

1、用cat进行拼接 cat命令能够显示或拼接文件内容,不过它的能力远不止如此。比如说,cat能够将标准输入数据与文件数据组合在一起。通常的做法是将stdin重定向到一个文件,然后再合并两个文件。而cat命令一次就能搞定这些操作。 用cat读取文件…

Java排序算法之希尔排序

希尔排序(Shell Sort)又称“缩小增量排序”,是直接插入排序算法的一种更高效的改进版本。它的基本思想是:首先将整个数组按照一定的间隔分成若干个子序列,然后对每个子序列分别进行插入排序,减小间隔&#…

2023双十一爆冷收场,订单后暗藏这些电商痛点问题需要注意

打开某软件的瞬间,手不小心抖一下就进入了淘宝,而且无法第一时间准确找到关闭按钮。相信不少人都在这个双十一通过开屏广告为淘宝“贡献”至“超8亿”的访问量,更有网友辣评:“现在打开别的软件跳转淘宝的速度都比直接打开淘宝要快…

大语言模型量化方法对比:GPTQ、GGUF、AWQ

在过去的一年里,大型语言模型(llm)有了飞速的发展,在本文中,我们将探讨几种(量化)的方式,除此以外,还会介绍分片及不同的保存和压缩策略。 说明:每次加载LLM示例后,建议清除缓存,以…

【LIUNX】配置缓存DNS服务

配置缓存DNS服务 A.安装bind bind-utils1.尝试修改named.conf配置文件2.测试nslookup B.修改named.conf配置文件1.配置文件2.再次测试 缓存DNS服务器:只提供域名解析结果的缓存功能,目的在于提高数据查询速度和效率,但是没有自己控制的区域地…

虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案

来源:雅名特自动驾驶 虹科方案 | 从概念到生产的自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案 自动驾驶软件在环(SiL)测试解决方案能够研究和验证高历程实验和恶劣驾…

计算属性与watch的区别,fetch与axios在vue中的异步请求,单文本组件使用,使用vite创建vue项目,组件的使用方法

7.计算属性 7-1计算属性-有缓存 模板中的表达式虽然很方便,但是只能做简单的逻辑操作,如果在模版中写太多的js逻辑,会使得模板过于臃肿,不利于维护,因此我们推荐使用计算属性来解决复杂的逻辑 <!DOCTYPE html> <html lang"en"> <head><meta …

初试 jmeter做压力测试

一.前言 压力测试是每一个Web应用程序上线之前都需要做的一个测试&#xff0c;他可以帮助我们发现系统中的瓶颈问题&#xff0c;减少发布到生产环境后出问题的几率&#xff1b;预估系统的承载能力&#xff0c;使我们能根据其做出一些应对措施。所以压力测试是一个非常重要的步…

BMS系统项目

1、通过电压监测是否冲满&#xff0c;通过电压可以监测是否放完电 电池得参数 单体过压&#xff08;充满电&#xff09; 过压恢复&#xff08;百分之90多&#xff09; 欠压保护&#xff08;百分之几得电&#xff0c;快关机了&#xff09; 欠压恢复&#xff08;就是欠压之上…

【博客系统】 一

该博客系统基于servlet和mysql数据库 , 并且通过xshell终端工具部署至云服务器. 实现的功能包括: 1.博客列表页 2.博客详情页 3.登陆页面 4.强制登陆检查 5.获取用户信息 6.退出登陆 7.发布博客 一.系统展示 登陆页面 博客列表页 博客详情页 博客编辑页 下面就开始编写代码了.…

【Java 进阶篇】JQuery 案例:下拉列表选中条目左右移动,打破选择的边界

在前端的舞台上&#xff0c;下拉列表是常见的用户交互元素&#xff0c;但有时候我们想要更多的交互体验。通过巧妙运用 JQuery&#xff0c;我们可以实现下拉列表中选中条目的左右移动功能&#xff0c;为用户提供更加灵活的选择方式。本篇博客将深入研究 JQuery 中实现这一功能的…

基于安卓android微信小程序的师生答疑交流平app

项目介绍 本课题研究的是基于HBuilder X系统平台的师生答疑交流APP&#xff0c;开发这款师生答疑交流APP主要是为了帮助用户可以不用约束时间与地点进行所需信息。本文详细讲述了师生答疑交流APP的界面设计及使用&#xff0c;主要包括界面的实现、控件的使用、界面的布局和异常…