Python基础之MySQL数据库

一、约束概述

1、为什么要约束

​ 为了防止数据库中存在不符合语义规定的数据和防止错误信息的输入、输出造成无效的操作而提出的

​ 为了保证数据的完整性,SQL规范以约束的方式对表数据进行额外的条件限制,从以下四个方面考虑

  • 实体完整性:例如一个表中不能存在两条相同的,无法区分的记录
  • 域完整性:例如年龄范围,性别范围
  • 引用完整性:例如学生所在的班级、学校,在学校中要能找到班级、在班级能找到学生
  • 用户自定义完整性:例如用户名唯一,密码不能不空

2、什么是约束

​ 约束是指,对字段名下数据的强制约束

​ 约束的方式:

  • 创建表时约束:create table
create table 表名(字段名 类型(数字) 约束条件);

3、约束的分类

  • 根据约束数据列的限制,约束可分为

    • 单列约束:每个约束只能约束一列
    • 多列约束:每个约束可约束多列数据
  • 根据约束的作用范围,约束可分为
    • 列级约束:只能作用在一个列上,跟在列的定义后面
    • 表级约束:可以作用在多个列上,单独定义
  • 根据约束的作用,约束可分为
    • 非空约束:规定某个字段不能为空
    • 唯一约束:规定某个字段的数据不能重复
    • 主键约束:非空且唯一,一个表只能拥有一个主键字段
    • 外键约束:主要体现在父子表中关系数据的约束操作
    • 检查约束:控制特定列中的值的完整性约束
    • 默认值约束:在不特别添加数据的情况下,该字段名下数据使用默认数据

4、查看当前表已有的约束

方式一:

​ show create table 表名;

方式二:

​ describe 表名;/desc 表名;

二、约束语法及用法

1、无符号

  • 关键词:unsigned

  • 作用:在SQL中,整型和浮点类型都自带正负号,而很多数据并用不到负数,例如人的年龄,手机号码,这时就可以通过约束条件解除正负号

mysql> create table t2(id tinyint unsigned);
Query OK, 0 rows affected (0.01 sec)

2、零填充

  • 关键词:zerofill

  • 作用:在创建表时,整型和浮点型后一般不用输入数字,系统会默认生成,在添加数据后,系统指挥默认显示该数值的大小及位数,通过零填充加数值,可固定数据值现实位数,不足部分用零填充

mysql> create table t4(id tinyint(2) zerofill);
Query OK, 0 rows affected (0.01 sec)

3、非空

  • 关键词:not null

  • 作用:所有字段类型,在不做非空约束的情况下,插入的数据值都可以为空(null),在创建表阶段可以约束该字段下数据为非空,约束后在往表内添加数据时,该字段下不能为空,空字符除外

mysql> create table t5(id int(3) zerofill, name varchar(16) not null);
Query OK, 0 rows affected (0.02 sec)

4、唯一值

4、1.单列唯一(列级)

  • 关键词:unique

  • 作用:唯一值是指,在创建表阶段,可通过约束唯一值的条件,使在往该表内约束的字段下添加的数据不能重复出现,例如往序号字段下添加‘序号1’后,该序号将不能在重复出现在其他列

mysql> create table t6(id int unique, name varchar(16) not null);
Query OK, 0 rows affected (0.04 sec)

4、2.联合唯一(表级)

  • 关键词:unique(字段名1,字段名2,...)

  • 作用:联合唯一不在单个字段名下定义,而是单独定义,在关键词后方括号内添加需要进行联合唯一的字段名,那么被添加的多个字段名的数据值将不能共同出现,单个字段名下的数据值可以重复

mysql> create table t7(id int, name varchar(16), unique(id, name));
Query OK, 0 rows affected (0.02 sec)

5、主键

  • 关键词:primary key

  • 作用:单从约束层面上而言的话,主键就相当于‘非空且唯一’,InnoDB存储引擎规定了所有的表都必须拥有且只能有一个主键(在创建表的时候,可以不用手动约束,系统会将其他非空且唯一的字段升级为主键,如果都没有约束的话,后台会自动生成一个隐藏的主键),主键可以加快数据的搜索速度(如果没有主键的话,查找数据就需要一行一行的进行),在我们创建表的时候应该主动约束一个字段为主键,用来标识数据的唯一性,通常使用‘id(编号)’字段

mysql> create table t8(id int primary key, name varchar(16));
Query OK, 0 rows affected (0.02 sec)

6、自增

  • 关键词:auto_increment

  • 作用:通常在存储多个数据的时候,我们都会给数据进行编号,方便查找,自增的意思就是帮助我们生成数据的编号,不需要在手动填写,这样的好处就是省时、省力,还不用专门的去记忆当前的需要是多少。

  • 特性:自增不会因数据删除而退回,只会往前,如果自己设置了更大的数,那么自增就会基于这个数往更大的数去自增,,自增的字段只能是主键

  • 格式化表格:

    • truncate 表名; (可以用来个格式化表格并重置自增)
mysql> insert into t9(name, age) values('jason', 18),('kang',19);
Query OK, 2 rows affected (0.00 sec)
Records: 2 Duplicates: 0 Warnings: 0

7、外键

7、1.外键的定义

​ 外键是某个表中某一列,它包含在另一个表的主键中

​ 外键也是索引的一种,是通过一张表指向另一张表中的主键,来对两张表进行关联

​ 一张表可以有一个外键,也可以存在多个外键,与多张表进行关联

7、2.外键的作用

主要用于表与表之间的数据关联,减少数据冗余,保证数据的一致性,完整性,主要体现在以下两个方面:
  • 阻止执行:

    • 从表插入新行,其外键值不是主表的主键值便阻止插入
    • 从表修改外键值,新表不是主表的主键值便阻止修改
    • 主表删除行,其主键值在从表里存在则阻止删除(想要删除必须删除从表的相关行)
    • 主表修改主键值,旧值在从表里存在则阻止修改(要想修改,必须先删除从表的相关行)
  • 级联执行:
    • 主表删除行,连带删除从表关联行
    • 主表修改值,连带修改从表关联行的值

7、3.外键的建立

主表:

create table 主表名(
id 类型 主键 ,
字段名 类型 约束条件)

从表:

create table 从表名(
id 类型 主键 ,
字段名 类型(数字) 约束条件,
绑定外键的字段名 int,
foreign key(主表名) references 主表名(主表的主键字段名)
)
  • 在创建主表和从表时,主表必须已经存在于数据库中
  • 录入数据的时候一定要先录入主表的数据
  • 修改数据的时候外键字段无法删除和修改

级联创建的方式:

​ 需要在创建表阶段,在从表外键关键词后加入:

  • 级联更新:on update cascade
  • 级联删除:on delete cascade
create table 从表名(
id 类型 主键 ,
字段名 类型(数字) 约束条件,
绑定外键的字段名 int,
foreign key(主表名) references 主表名(主表的主键字段名)
on update cascade
on delete cascade)

7、4.外键的多种关系

1.一对多:

​ 以员工表为例,通常,一个员工只可以对应一个部门,而一个部门可以对应多个员工,这就是一对多的关系

​ 对于一对多的关系,外键字段应该建立在‘多’的一方

create table dep(id int primary key auto_increment,
dep_name varchar(32)
); create table emp(id int primary key auto_increment,
emp_name varchar(32) not null,
dep_id int, foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
);

2.多对多:

​ 以书籍表与作者表为例

  • 先站在书籍表的角度

    问:一本书能否对应多个作者

    答:可以

  • 再站在作者表的角度

    问:一个作者能否对应多本书

    答:可以

  • 结论:两个都可以 关系就是'多对多'

    针对'多对多'不能在表中直接创建 需要新建第三张关系表

create table book(
id int primary key auto_increment,
title varchar(32),
price float(5,2)
); create table author(
id int primary key auto_increment,
name varchar(32),
phone bigint
); create table book2author(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);

3.一对一:

​ 以用户表与用户详情表为例

  • 先站在用户表的角度

    问:一个用户能否对应多个用户详情

    答:不可以
  • 再站在用户详情表的角度

    问:一个用户详情能否对应多个用户

    答:不可以
  • 结论:两个都可以 关系就是'一对一'或者没有关系

    针对'一对一'外键字段建在任何一方都可以 但是推荐建在查询频率较高的表中
create table user(
id int primary key auto_increment,
name varchar(32),
detail_id int unique,
foreign key(detail_id) references userdetail(id)
on update cascade
on delete cascade
); create table userdetail(
id int primary key auto_increment,
phone bigint
);

MySQL数据库:6、约束的概述及语法的更多相关文章

  1. day38:MySQL数据库之约束&索引&外键&存储引擎

    目录 part1:数据类型 part2:约束 part3:主键索引 PRI &唯一索引 UNI &普通索引 MUL part4:外键:foreign key part5:在外键中设置联 ...

  2. MySQL数据库——数据约束

    1 什么数据约束 对用户操作表的数据进行约束 2 默认值(缺省约束) 作用: 当用户对使用默认值的字段不插入值的时候,就使用默认值. 注意: 1)对默认值字段插入null是可以的 2)对默认值字段可以 ...

  3. MySQL数据库的约束

    一 默认值约束 约束语句 default  ‘默认值’ 在建立表的时候在想要加默认约束的字段名,数据类型后面加default ‘默认值’ 例如 : create table emp( uid  int ...

  4. MySql数据库数据类型及约束介绍

    1,MySql中数据类型介绍 整型及浮点型 数据类型 存储范围 字节 TINYINT 有符号值:-2^到2^7-1 无符号值:0到2^8-1 2 SMALLINT 有符号值:-2^15到2^15-1 ...

  5. Day 1 MySQL数据库

    MySQL数据库_1 一.概述 1.数据(DATA) 描述事物的符号记录称为数据,描述事物的符号既可以是数字,也可以是文字.图片,图像.声音.语言等,数据由多种表现形式,它们都可以经过数字化后存入计算 ...

  6. mysql 数据库优化第一篇(基础)

    Mysql数据库优化 1. 优化概述 存储层:存储引擎.字段类型选择.范式设计 设计层:索引.缓存.分区(分表) 架构层:多个mysql服务器设置,读写分离(主从模式) sql语句层:多个sql语句都 ...

  7. 第二百七十五节,MySQL数据库安装和介绍

    MySQL数据库安装 一.概述 1.什么是数据库 ? 答:数据的仓库,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access.MS SQL Server等 ? 答:他们均是一种 ...

  8. Python操作MySQL数据库(步骤教程)

    我们经常需要将大量数据保存起来以备后续使用,数据库是一个很好的解决方案.在众多数据库中,MySQL数据库算是入门比较简单.语法比较简单,同时也比较实用的一个.在这篇博客中,将以MySQL数据库为例,介 ...

  9. MySQL数据库企业级应用实践(主从复制)

    MySQL数据库企业级应用实践(主从复制) 链接:https://pan.baidu.com/s/1ANGg3Kd_28BzQrA5ya17fQ 提取码:ekpy 复制这段内容后打开百度网盘手机App ...

  10. {MySQL数据库初识}一 数据库概述 二 MySQL介绍 三 MySQL的下载安装、简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 初识sql语句

    MySQL数据库初识 MySQL数据库 本节目录 一 数据库概述 二 MySQL介绍 三 MySQL的下载安装.简单应用及目录介绍 四 root用户密码设置及忘记密码的解决方案 五 修改字符集编码 六 ...

随机推荐

  1. 使用Kali的wifite和aircrack-ng联合破解wifi密码

    准备材料 有kali的虚拟机,这里推荐VM 一个超级便宜的USB无线网卡,很便宜三十几块钱 一个靠谱的WPA密码字典(关于字典文件,我这里整理了好多,可联系我.QQ:1213456261) 1.运行k ...

  2. 【SQLServer】max worker threads参数配置

    查看和设置max worker threads USE master; //选中你想设置max worker threads的数据库.master表示在实例级别进行设置 GO EXEC sp_conf ...

  3. jenkins流水线部署springboot应用到k8s集群(k3s+jenkins+gitee+maven+docker)(1)

    前言:前面写过2篇文章,介绍jenkins通过slave节点部署构建并发布应用到虚拟机中,本篇介绍k8s(k3s)环境下,部署jenkins,通过流水线脚本方式构建发布应用到k8s(k3s)集群环境中 ...

  4. 统一建模语言UML---类图

    什么是统一建模语言,来看看百科中的介绍统一建模语言(Unified Modeling Language,UML)是一种为面向对象系统的产品进行说明.可视化和编制文档的一种标准语言,是非专利的第三代建模 ...

  5. AOP实现系统告警

    工作群里的消息怕过于安静,又怕过于频繁 一.业务背景 在开发的过程中会遇到各种各样的开发问题,服务器宕机.网络抖动.代码本身的bug等等.针对代码的bug,我们可以提前预支,通过发送告警信息来警示我们 ...

  6. Deployment必须包含资源对象

    Deployment 是一个控制器,能够用来控制 pod 数量跟期望数量一致,配置 pod 的发布方式 Deployment 会按照给定策略进行发布指定 pod,保证在更新过程中不可用数量在限定范围内 ...

  7. k8s安装常用软件的yaml文件

    参考网址:https://www.bejson.com (网站文件部分有坑,需要擦亮眼睛) nginx k8s版本:v1.20 apiVersion: apps/v1 kind: Deployment ...

  8. 1_requests基础用法

    requests模块的基本使用 什么是requests模块? Python中封装好的一个基于网络请求的模块 requests模块的作用? 用来模拟浏览器发请求 requests模块的环境安装: pip ...

  9. PAT (Basic Level) Practice 1025 反转链表 分数 25

    给定一个常数 K 以及一个单链表 L,请编写程序将 L 中每 K 个结点反转.例如:给定 L 为 1→2→3→4→5→6,K 为 3,则输出应该为 3→2→1→6→5→4:如果 K 为 4,则输出应该 ...

  10. Python(二)常用的正则表达式

    表单字段验证常用正则表达式 1.姓名 /^[\u4e00-\u9fa5]{2,4}$/ //2-41 2.手机号码 /^(13[0-9]|14[01456879]|15[0-35-9] 3.座机号码 ...