MYSQL--完整性约束

目录

约束

设置约束

方式一

推荐:方式二

 删除约束

主键约束

 自增列

组合主键, 联合主键

外键约束

 给表添加外键约束

注意:


约束

概念:约束是作用于表中字段上的规则,用于限制存储在表中的数据。

目的:保证数据库中数据的正确、有效性和完整性。

注意:约束是作用于表中字段上的,可以在创建表/修改表的时候添加约束。  

主键约束:唯一且不为null,每一张表只能有一个主键约束

唯一约束:唯一,每张表可以有多个唯一约束

非空约束:不能为null

默认值约束:给列设置默认值

外键约束:子表某列数据来源主表某列的数据

检查约束(check(8.0.16版本之后)):限定值的范围

设置约束

方式一

表已经创建好了,以修改表的方式来添加约束,如果表中的数据违背约束,添加失败 

ALTER  TABLE  表名  add  约束; 

推荐:方式二

创建表的时候,就设置约束

举例:

创建学生表:id(唯一 不能为空),name(非空),sex(默认值 男),age,email(唯一)

(1)在列声明后写

create table tb_student(
    id int primary key ,#priamry key 主键约束
    name varchar(50) NOT NULL ,#NOT NULL 非空约束
    sex varchar(10) default '男',#default 默认值约束
    age int,
    email varchar(100) unique #唯一约束
);

 性别的默认值为男:

(2)另起一行写约束,非空,默认值不可以

班级表:id 主键,cname 班级名称 非空,loc 教室位置(唯一)

create table tb_class(
    id int,
    cname varchar(100) not null ,
    loc varchar(100),
    primary key (id),
    unique (loc)
);

 班级位置为唯一,故报错,无法添加:

 删除约束

ALTER  TABLE  表名  DROP  约束;

alter table student1 drop primary key ;

datagrip可以手动加约束或者修改约束,不通过命令行: 

 

主键约束

表设计经验: 

  1. 每张表都应该有一个主键
  2. 主键加在非业务数据上,主键不允许修改

create table tb_employee_job(
    eid int,
    job_id int,
    primary key (eid,job_id)
);

 自增列

自增列 默认开始值为:1,每次加1

auto_increment   自增列,每个表只能有一个,加在主键,唯一键

create table tb_class(
    id int auto_increment,
    cname varchar(100) not null ,
    loc varchar(100),
    primary key (id),
    unique (loc)
);

不给id列赋值,默认值为1:

如果手动给自增列赋值,是否报错? 不报错  id:24  下一个自增列的值:25

组合主键, 联合主键

create table tb_employee_job(
    eid int,
    job_id int,
    primary key (eid,job_id)  #组合主键
);


insert into tb_employee_job values (1,1);
insert into tb_employee_job values (1,2);
insert into tb_employee_job values (2,1);

外键约束

外键约束: 对外键的一种约束, 外键的值只能来源于主表主键值,唯一键值

外键设计经验: 

  1. 多对多的关系, 需要中间表存储外键   
  2. 一对多,外键加在多的一方  
  3. 一对一: 外键加在任何一方, 外键必须加唯一约束

主外键是构成表与表关联的唯一途径!

       外键是另一张表的主键!例如员工表与部门表之间就存在关联关系,其中员工表中的部门编号字段就是外键,是相对部门表的外键。

我们来看一个例子:

        左侧的emp表是员工表,里面存储员工的基本信息,包含员工的ID、姓名、年龄、职位、薪资、入职日期、上级主管ID、部门ID,在员工的信息中存储的是部门的ID dept_id,而这个部门的ID是关联的部门表dept的主键id,那emp表的dept_id就是外键,关联的是另一张表的主键。

注意:目前上述两张表,只是在逻辑上存在这样一层关系;在数据库层面,并未建立外键关联,所以是无法保证数据的一致性和完整性的。

外键: 一个列, 维护两张表的关系

举例:

班级表与学生表: 1: n  外键加在学生表:  班级id外键

create table tb_student(
    id int primary key, #primary key 主键约束
    name varchar(50) not null, # not null 非空约束
    sex varchar(10) default  '男', # default  值 默认值约束
    age int,
    email varchar(100) unique, # unique 唯一约束
    cid int
);

 给表添加外键约束

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


create table tb_student(
    id int primary key, #primary key 主键约束
    name varchar(50) not null, # not null 非空约束
    sex varchar(10) default  '男', # default  值 默认值约束
    age int,
    email varchar(100) unique, # unique 唯一约束
    cid int,
     foreign key (cid) references tb_class(id) #外键约束  外键名默认
);

注意:

  1.    创建表顺序: 先主表(被引用表tb_class), 再子表(使用外键约束的表,tb_student)
  2.    删除表顺序: 先删除子表,再删除主表
  3.    在实际开发中, 一般很少使用外键约束, 外键有程序赋值

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

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

相关文章

线程池面试点

为什么使用线程池?线程池的作用是什么?线程池的执行顺序?线程池的入参是哪些?分别代表什么意思? 频繁的创建线程与销毁线程,资源耗费与上下文切换时间开销非常大,而线程池可以避免这种情况. 入参有核心线程数,最大线…

IDEA安装(AI)MarsCode插件

1. 注册MarsCode点击注册MarsCode账号 2. 安装MarsCode 第一步: 打开IDEA设置页面, File -> Settings… 第二步: 在左侧导航栏中选择 “Plugins”, 在 “Marketplace” 中搜索"mars", 如图, 点击 “Installed” 第三步: 插件安装完成后, 重启IDEA. 点击右侧导航栏…

软考高项比中项在难度上高多少?

论文这一科难倒了70%的考生,再加上30%的项目管理技能运用知识,使得考生们感到困难重重。题主提到的高额培训费主要是因为论文这一科目的难度较大。虽然直接考取高级资格是理想状态,但有些人可能无法一次成功,因此可以先考取中级资…

飞腾平台Arm ComputeLibrary编译安装指南

【写在前面】 飞腾开发者平台是基于飞腾自身强大的技术基础和开放能力,聚合行业内优秀资源而打造的。该平台覆盖了操作系统、算法、数据库、安全、平台工具、虚拟化、存储、网络、固件等多个前沿技术领域,包含了应用使能套件、软件仓库、软件支持、软件适…

【数据结构】堆:建堆/向下调整/上向调整/堆排序/TOK问题

文章目录 前言堆的定义1.大小堆2.完全二叉树 堆的实现堆的数据结构初始化销毁取堆顶元素判断堆是否为空父结点和子结点下标关系(重要) 向下调整法-O(n)小堆版大堆版 向上调整法-nlog(n)堆的插入和删除插入(调用向上调整)删除(调用向下调整) 构建最大堆向…

Qt第三课 ----------输入类的控件属性

作者前言 🎂 ✨✨✨✨✨✨🍧🍧🍧🍧🍧🍧🍧🎂 ​🎂 作者介绍: 🎂🎂 🎂 🎉🎉&#x1f389…

java面试2.0

一.Zookeeper 1.定义 ZooKeeper 是一个开源的分布式协调服务,它的设计目标是将那些复杂且容易出错的分布式一致性服务封装起来,构成一个高效可靠的原语集,并以一系列简单易用的接口提供给用户使用。 ZooKeeper 为我们提供了高可用、高性能…

【论文复现】语言模型中的多模态链式推理

📕作者简介:热爱跑步的恒川,致力于C/C、Java、Python等多编程语言,热爱跑步,喜爱音乐、摄影的一位博主。 📗本文收录于论文复现系列,大家有兴趣的可以看一看 📘相关专栏C语言初阶、C…

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】

SPA——MVC 与 MVVM - 2024最新版前端秋招面试短期突击面试题【100道】 🌐 在现代前端开发中,单页面应用(SPA)以及不同的架构模式(如MVC和MVVM)是实现用户交互的关键概念。了解它们的优缺点以及如何应用&a…

前端八股文第五篇

41. 做的比较好的项目,展开讲讲 我曾参与开发过一个电商平台的项目,该项目是一个多端适配的电商平台,包括网页端、移动端和小程序端。在这个项目中,我主要负责前端开发工作。我们团队采用了 Vue.js 框架进行开发,使用…

运筹说 第127期 | 存储论相关模型代码实现

本期我们进行运筹学之存储论算法的讲解,我们将对常见的商品存储模型进行介绍,并求解不同供需条件下的最优存储策略,通过MATLAB和Python工具帮助大家快速求解最优存储策略,做到事半功倍。由于篇幅有限,小编接下来只展示…

【Linux】Linux权限

本文将会围绕着下面5个问题进行讲解: 认识Linux下用户的分类什么叫做权限没有权限会有什么现象如何进行权限的修改其他与权限相关的问题 好了,本章内容就要开始了,准备你的大脑,开凿吧!!! 认识…

Ubuntu系统如何实现键盘按键映射到其他按键(以 Ctrl+c 映射到 F3,Ctrl+v 映射到 F4 为例)

文章目录 写在前面1. 功能描述2. 实现步骤2.1 安装AutoKey2.2 软件设置2.2.1 软件设置 2.3 测试是否安装成功 参考链接 写在前面 自己的测试环境: Ubuntu20.04 1. 功能描述 Ubuntu系统使用Ctrlc 、Ctrlv 进行复制粘贴操作的时候,时间长了就会出现小拇指…

threejs开源实例-粒子地球

源码 three.js webgl - geometry - cube <script type"module">import * as THREE from "three";import { OrbitControls } from "three/addons/controls/OrbitControls.js";import { GUI } from "three/addons/libs/lil-gui.modul…

苍穹外卖的vue开发

前端的环境搭建 技术选型 熟悉目录结构 如何梳理代码 以登录功能进行示例 先看前端页面 这个路径一定是对应了一个对应的路由,这个路由一定对应了某个组件 找到登录的方法 这个方法在store中,是异步方法 store中有一个actions方法 对应的是login的api请求 request是我们单独…

docker desktop使用ubuntu18.04带图形化+运行qemu

记录一下docker desktop使用ubuntu18.04带图形化命令和使用步骤 1. 下载镜像 参考&#xff1a;【Docker教程】Docker部署Ubuntu18.04(带图形化界面) 命令&#xff1a; docker pull kasmweb/ubuntu-bionic-desktop:1.10.02. 启动镜像 命令&#xff1a; docker run -d -it …

springboot入门学习笔记2(连接mysql,使用mybatis,plus等)

对于application.yml的学习 application.yml 是 Spring Boot 的核心配置文件&#xff0c;用于定义应用程序的配置属性。 它允许开发者通过 YAML 格式配置各种属性&#xff0c;如服务器端口、数据库连接、第三方服务端点等。 这些属性通过 Spring 的 ConfigurationProperties…

5G基础知识

那个工种&#xff1f; FDD 频分双工&#xff08;Frequency Division Duplexing&#xff09;&#xff0c;理解起来很简单&#xff0c;就是把上行和下行业务隔离在两个频段&#xff0c;互不干扰。 而 TDD 时分双工&#xff08;Time-Division Duplexing&#xff09;&#xff0c;是…

大数据治理:策略、技术与挑战

随着信息技术的飞速发展&#xff0c;大数据已经成为现代企业运营和决策的重要基础。然而&#xff0c;大数据的复杂性、多样性和规模性给数据管理带来了前所未有的挑战。因此&#xff0c;大数据治理应运而生&#xff0c;成为确保数据质量、合规性、安全性和可用性的关键手段。本…

022集——统计多条线的总长度(CAD—C#二次开发入门)

如下图所示&#xff0c;选择多条线并统计长度&#xff1a; c#中不包含直接获取curve曲线长度 属性&#xff0c;需用如下方法&#xff1a;curve.GetDistanceAtParameter(item.EndParam) 附部分代码如下&#xff1a; using Autodesk.AutoCAD.ApplicationServices; using Autode…