【Mysql】 表的约束

news2024/11/28 16:27:45

请添加图片描述

文章目录

  • 【Mysql】 表的约束
      • 空属性
      • 默认值
      • 列描述
      • zerofill
      • 主键
      • 自增长
      • 唯一键
      • 外键
      • 综合案例

【Mysql】 表的约束

上一个博客记录的是mysql中的类型,这篇博客记录的是mysql中的表的约束;即列字段对插入数据的约束

空属性

  • 俩个值: null (默认) 和 not null (不为空)
  • 描述: 数据库默认字段基本都是空字段, 但是实际开发时,尽可能保证字段不为空,因为数据库为空没办法参与运算,这时候就可以使用not null 描诉该列字段

例:

先创建一个班级表,包含课程名和课程上课的教室位置

站在正常的逻辑中, 身为一个‘大学性’:

  • 如果课程没有名字,你就不知道该带什么书去上课
  • 如果上课的教室没有,就不知道该去那听课
 create table myclass(
     subject varchar(20) not null,
     class_room varchar(10) not null);

插入数据时,其中一项没有给数据,都会插入失败

注: 使用desc 可以分析表结构


默认值

  • 默认值: 某一种数据会经常性的出现某个具体的值,可以在一开始就指定好,在需要真实数据的时候,用户可以选择性的使用默认值。

例:

 create table tt10 (
 name varchar(20) not null,
 age tinyint unsigned default 0,
 sex char(2) default '男'
 );

对于有默认值的字段,如果插入数据时没有指定时,就以默认初始值插入数据


列描述

  • 列描述:comment,没有实际含义,专门用来描述字段,会根据表创建语句保存,用来给程序员或DBA来进行了解 – 可类比于 我们写代码时的注释

例:

create table tt11(
name varchar (20) not null comment '姓名',
age tinyint unsigned default 0 comment '年龄',
sex char(2) default '男' comment '性别'
) ;

值得注意的地方是使用desc是看不到 描诉内容的;

但是使用show 可以


zerofill

刚开始学习数据库时,很多人对数字类型后面的长度很迷茫。 我们可以看到上面tinyint(3) ,这个代表什么意思呢?实际上就是代表age数据表示位数为 3位 即0 ~ 111;

例:

create table tt3(
'a' int (5) unsigned zerofill default null ,
'b' int (10) unsigned 
);

插入数据(10,10)

然后再将列字段b的也改为zerofill看看会有什么变化,并且故意将无符号设置去掉,查看插入负数是否具有前导0;

alter table tt3 change b b int (10) zerofill;

试着插入数据 (19,-19)

发现当int 添加zerofill 之后,相当于一起设置了无符号;

  • 所以说: zerofill 实际上就是当int (n) 中,的数据不够n位时(10进制),会自动补前导0

主键

  • 主键:primary key用来唯一的约束该字段里面的数据,不能重复,不能为空,一张表中最多只能有一个主键;主键所在的列通常是整数类型。

  • 主键特点: 1. 主键对应的字段不能重复

  • 创建主键的方式:

    • 创建表时直接指定主键
    • 创建表后,没有主键的情况下,追加主键

创建表时直接在字段指定主键

create table t4(
id int primary key comment '学号不能为空',
name varchar(20) not null
);

插入的数据主键值重复,操作失败

当表创建好以后但是没有主键的时候,可以再次追加主键

alter table 表名 add primary key (列字段名)

删除主键

alter table 表名 drop primary key;

删除主键之后就可以插入主键值相同的数据了

注: 表有数据时,想要将某个字段设为主键,该字段的数据必须没有冲突

复合主键

在创建表的时候,在所有字段之后,使用primary key(主键字段列表)来创建主键,如果有多个字段作为主键,可以使用复合主键。

mysql> create table tt14(
-> id int unsigned,
-> course char(10) comment '课程代码',
-> score tinyint unsigned default 60 comment '成绩',
-> primary key(id, course) -- id和course为复合主键
-> );
  • 注: 复合主键值,只有在俩项都冲突时,才会认为具有冲突

自增长

  • auto_increment:当对应的字段,不给值,会自动的被系统触发,系统会从当前字段中已经有的最大值+1操作,得到一个新的不同的值。通常和主键搭配使用,作为逻辑主键。
  • 自增长特点:
    • 任何一个字段要做自增长,前提是本身是一个索引(key一栏有值)
    • 自增长字段必须是整数
    • 一张表最多只能有一个自增长

例:

create table tt15 (
id int unsigned primary key auto_increment,
name varchar(100) not null default ''
);

我们会发现将主键设为自增长之后,相当于id 拥有了默认值

插入数据 ('小黑') (5,’小李’) ('小美')

索引

  • 在关系数据库中,索引是一种单独的、物理的对数据库表中一列或多列的值进行排序的一种存储结构,它是某个表中一列或若干列值的集合和相应的指向表中物理标识这些值的数据页的逻辑指针清单。索引的作用相当于图书的目录,可以根据目录中的页码快速找到所需的内容。

  • 索引提供指向存储在表的指定列中的数据值的指针,然后根据您指定的排序顺序对这些指针排序。数据库使用索引以找到特定值,然后顺指针找到包含该值的行。这样可以使对应于表的SQL语句执行得更快,可快速访问数据库表中的特定信息。


唯一键

计算机就是人类世界的一种映射,mysql中的表也是如此,而我们人的数据中很多都具有唯一性,身份证号,手机电话,qq号… , 所以只有主键表示数据唯一性肯定是不够的,所以还需要其他表属性来维护人信息的唯一性 – 唯一键

唯一键

  • 一张表中有往往有很多字段需要唯一性,数据不能重复,但是一张表中只能有一个主键:唯一键就可以解决表中有多个字段需要唯一性约束的问题。
  • 主键和唯一键
    • 主键只能有一个,唯一键可以有很多个,所以唯一键和主键是不冲突的,配合使用来满足许多字段需要唯一性约束需求
    • 主键 和 唯一键的数据都是不能重复的,但唯一键数据可以为空 – qq号,身份证等数据都是不能重复的

可以将唯一键简单理解为满足表中列字段唯一性需求的补充;

例:

create table student1 (
id char(10) unique comment '学号', 
name varchar (10)
);

唯一键的数据是可以为空的

插入数据:(1,'小黑’) , ('小李子')

说明:

  • 当一个表中有多个字段需要唯一性约束时,就可以唯一键
  • NULL代表为空,也就是说插入多个 (NULL,’名字‘) 的数据是不算重复的

外键

上面所有字段都是描诉一个表里面的字段属性,而外键是描诉表和表之间的关系

  • 外键用于定义主表和从表之间的关系:外键约束主要定义在从表上,主表则必须是有主键约束unique约束。当定义外键后,要求外键列数据必须在主表的主键列存在或为null

语法:

forgign key (字段名) refercences 主表(列字段)

案例:

分析:

  • 学生表是依赖于班级表的,只有班级分好了名单,学生表中才有分类
  • 且学生表中的数据class_Id 一定是在主键表中存在的,不然该学生的数据就是非法数据 , 就好像某学校6年级有3个班,却有个同学说自己是6年级4班,说明该学生就不是本学校的

依旧上面的示意图进行设计:

外键: class_id ,从表中stu依赖于主表myclass

  • 主表
create table myclass (
    id int primary key,
    name varchar(30) not null comment'班级名'
);	
  • 从表
create table stu (
    id int primary key,
    name varchar(30) not null comment '学生名',
    class_id int,
    foreign key (class_id) references myclass(id)
);

查看表结构: desc

  • 正常插入数据
insert into myclass values (10, 'c++大牛班'), (20,'java大神班') , (30, '牛马班');
-- 插入学生数据
insert into stu values (100,'张三', 10) , (101,'李四',20);

查看表中数据

  • 尝试插入非法数据

因为没有40号这个班级在主表中不存在, 所以插入数据不成功

insert into stu values (102,'小李',40);

小结:

  • 一般而言外键在从表中是可重复的,但是在主表中是需要具有唯一性的,所以外键在主表中一般是作为主键的
  • 上例的stu表和myclass 表是具有一定的逻辑关系的,通过class_id联系起来的,而这只是单纯的逻辑约束,还需要有实质性的外键约束,mysql会自动为我们维护这种关系 – 外键值非法的数据不能被插入到从表去

综合案例

有一个商店的数据,记录客户及购物情况,有以下三个表组成:

  • 商品goods(商品编号goods_id,商品名goods_name, 单价unitprice, 商品类别category, 供应商provider)

  • 客户customer(客户号customer_id,姓名name,住址address,邮箱email,性别sex,身份证card_id)

  • 购买purchase(购买订单号order_id,客户号customer_id,商品号goods_id,购买数量nums)

要求

  • 每个表的主外键

  • 客户的姓名不能为空值

  • 邮箱不能重复

  • 客户的性别(男,女)

SQL:

-- 商品
create table if not exists goods
(
    goods_id int primary key auto_increment comment '商品编号',
    goods_name varchar(32) not null comment '商品名称',
    unitprice int not null default 0 comment '单价,单位分',
    category varchar(12) comment '商品分类',
    provider varchar(64) not null comment '供应商名称'
);
-- 客户
create table if not exists customer
(
    customer_id int primary key auto_increment comment '客户编号',
    name varchar(32) not null comment '客户姓名',
    address varchar(256) comment '客户地址',
    email varchar(64) unique key comment '电子邮箱',
    sex enum('男','女') not null comment '性别',
    card_id char(18) unique key comment '身份证'
);
-- 购买
create table if not exists purchase
(
    order_id int primary key auto_increment comment '订单号',
    customer_id int comment '客户编号',
    goods_id int comment '商品编号',
    nums int default 0 comment '购买数量',
    foreign key (customer_id) references customer(customer_id),
    foreign key (goods_id) references goods(goods_id)
);

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

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

相关文章

Vue3 + ElementPlus实战学习——模拟简单的联系人列表管理后台

文章目录 📋前言🎯demo 介绍🎯功能分析🧩数据的展示与分页功能🧩编辑功能🧩删除功能 🎯部分代码分析🎯完整代码📝最后 📋前言 这篇文章介绍一下基于 Vue3 和…

DataSpell第一次安装使用教程

官网: Download DataSpell: The IDE for Data Scientists (jetbrains.com) 双击.exe文件开始安装 安装过程就一直点击下一步就好,遇到方框需要勾选的全部勾上。 注意尽量别安装在C盘,我安装在了D盘。 获取jihuoma:(484条消息)…

MySql学习1:安装

前言 学习教程:黑马程序员 MySQL数据库入门到精通,从mysql安装到mysql高级、mysql优化全囊括 目前的打算是跟着教程学习基础部分,进阶和运维部分以后可能会学习。 安装 关于如何安装mysql可以跟着视频里的操作,但是对于我这种…

盘点一个AI你画我猜的小工具

点击上方“Python爬虫与数据挖掘”,进行关注 回复“书籍”即可获赠Python从入门到进阶共10本电子书 今 日 鸡 汤 寻声暗问弹者谁,琵琶声停欲语迟。 大家好,我是Python进阶者。 一、前言 前几天在【ChatGPT&AI破局俱乐部】知识星球发现了一…

【Python】Python系列教程-- Python3 字典(十四)

文章目录 前言创建空字典访问字典里的值修改字典删除字典元素字典键的特性字典内置函数&方法 前言 往期回顾: Python系列教程–Python3介绍(一)Python系列教程–Python3 环境搭建(二)Python系列教程–Python3 VS…

【Java】Java(四十七):单元测试

文章目录 1. 概述2. 特点3. 使用步骤4. 相关注解5. 疑惑: 有了main函数 为啥还要 单元测试6. 后记 1. 概述 JUnit是一个 Java 编程语言的单元测试工具。JUnit 是一个非常重要的测试工具 2. 特点 JUnit是一个开放源代码的测试工具。提供注解来识别测试方法。JUnit测试可以让…

在k8s平台部署个人博客(三)

先下载实战-在k8s平台部署个人博客-资源包 再K8s部署个人博客 实验步骤如下: [rootk8s-master]# kubectl create secret generic mysql-pass --from-literalpasswordYOUR_PASSWORD #把mysql.tar.gz和wordpress.tar.gz上传到K8s工作节点,手动解压即可…

java企业级信息系统开发学习笔记09 利用MyBatis实现CRUD操作

文章目录 一、学习目标利用MyBatis查询表记录利用MyBatis插入表记录利用MyBatis更新表记录利用MyBatis删除表记录 二、查询表记录1.打开mybatis项目(一)在映射器配置文件里引入结果映射元素(二)添加按姓名查询用户记录功能1、添加…

软考——下午题部分,例题一,二,三,六

例题一 11年上半年 病人,护理人员,医生 D 生命体征范围文件 日志文件 病历文件 治疗意见文件 14年上 E1 巴士司机,2 机械师,3 会计,4 主管,5 库存管理系统 D 巴士列表文件 维修记录文件 部件清单 人事档案 14年下 1 客户 2 供应商 D 销售订单表 库存…

基于simulink仿真弹跳球

一、前言 示例可视化了一个从地板上弹起的球。球在撞击地板时变形,保持球的体积恒定。变形是通过修改球的刻度场来实现的。 弹跳球实验有以下几个意义: 1. 研究物体的弹性:弹跳球实验可以帮助我们了解不同物体的弹性特性,包括弹性…

高校全奖PhD招生、大厂全职/实习招聘合集来了!快来拿offer!

本周,招聘小助手从「AI 求职」公众号中整理了来自 6 所高校和 6 家用人单位的「人工智能」相关全奖博士招生、算法实习等招聘信息。 分别来自新加坡国立大学、香港科技大学(广州)、华盛顿大学、字节跳动、小红书、京东、IDEA研究院等国内外知…

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据?

如何通过控制点或地物点生产地方坐标系的倾斜摄影三维模型数据? 要生成地方坐标系的倾斜摄影三维模型数据,需要进行以下步骤: 1、收集影像数据 首先需要采集大量的航空影像和地面影像,以构建真实世界中的物体模型。这些影像可以…

Electron+Vue+Vite: 开发实践—初始化项目

运行系统:Apple M1 ,16 GB 开发工具:VSCode NodeJS:18.10 参考:https://github.com/electron-vite/electron-vite-vue.git 文章目录 创建项目构建项目客户端构建网页构建创建项目 npm create electron-vitecd electron-vite-tempsudo yarn installsudo yarn d

DDD与传统的OOA/D有什么区别?

DDD(Domain-Driven Design)与传统的OOA/D(Object-Oriented Analysis and Design)有以下几个不同点: 领域驱动设计注重建立一个通用语言,使得业务专家和技术人员之间能够沟通协作,在业务问题的解…

TrueNAS配置虚拟机网卡

TrueNAS支持运行虚拟机,但会出现虚拟机可以访问外网,却不能和主机的TrueNAS通讯。 这时,需要重新配置TrueNAS的网卡设置。 1. 原来的主机网卡配置 我的这台TrueNAS主机有两个以太网卡,目前使用的是enp4s0,IP地址192.1…

CPM-Bee本地部署的实战方案

大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…

从零开始学习JavaScript:轻松掌握编程语言的核心技能④

从零开始学习JavaScript:轻松掌握编程语言的核心技能④ 1. JavaScript 表单1.1 JavaScript 表单验证 2. JavaScript 保留关键字3. JavaScript this 关键字4. JavaScript let 和 const4.1 let4.2 const 5.JavaScript JSON6.JavaScript 异步编程7.JavaScript 代码规范…

4.协同工作与发布

目录 1 开发流程 2 人员分配情况 3 不同角色的权限 4 添加项目成员和体验成员 4.1 项目成员 4.1.1 添加 4.1.2 删除与修改权限 4.2 体验成员 4.2.1 添加 4.2.2 删除 5 发布上线 5.1 上传代码 5.2 提交审核 5.3 发布 6 推广 7 查看后台数据 1 …

留学生乱用ChatGPT真的太致命!被认定学术不诚信直接被退学?

01.ChatGPT留学生神器?作业论文全靠它? 近期留学圈内最火热的话题,肯定是关于ChatGPT。 “这个python作业我写不来,让ChatGPT帮我直接生成code就好了。” “论文英文的写不来,ChatGPT直接生成一篇essay,…

Linux - 进阶 使用 LAMP 搭建私有云存储 ( Nextcloud 搭建)

我们用到的私有云存储 >>> nextcloud (非常出名的一款 私有云搭建的应用响应程序 ) 预备工作 : # 关闭 selinux 及 防火墙 [rootserver ~]# setenforce 0 [rootserver ~]# systemctl stop firewalld # 搭建 LAMP 环境 L &…