提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档

文章目录

  • MySQL中数据类型
    • 整型
    • 浮点型
    • 字符串类型
    • 枚举和集合
    • 时间类型
    • timestamp YYYYMMDDHHMMSS(时间戳)
  • 约束
    • 约束关键字
      • unsigned 无符号
      • not null 不为空
      • default 设置默认值
      • unique 唯一约束,数据唯一不重复
      • primary key 主键,标记数据的唯一特征(唯一且不为空)
      • auto_increment 自增加1(一般配合主键使用, 或 unique进行自增)
      • zerofill 零填充(配合整型int使用) int(11) , 位数不够11位,拿0补充
    • 主键索引 PRI &唯一索引 UNI &普通索引 MUL
      • 联合唯一约束
      • 联合唯一约束(字段不设置成not null)
      • 联合唯一索引和主键之间是否可以同时存在?
  • 外键:foreign key
    • 在外键中设置联级删除和联级更新
    • 表和表之间的关系
  • 存储引擎
    • 概念
    • 语法
    • 关于约束的添加和删除

MySQL中数据类型

整型

tinyint 1个字节 有符号(-128 ~ 127) 无符号(unsigned) (0 ~ 255) 小整型值int 4个字节 有符号(-21亿 ~ 21亿 左右) 无符号(unsigned) (0 ~ 42亿) 大整型值
create table t1(id int , age tinyint );
insert into t1 values(2200000000,1) #  error
insert into t1 values(2100000000,1)
insert into t1 values(2100000000,128)  # error
insert into t1 values(2100000000,127)

浮点型

float(255,30) 单精度,总长度最多255位,小数长度最多30位,整数长度最多225位double(255,30) 双精度,总长度最多255位,小数长度最多30位,整数长度最多225位decimal(65,30) 金钱类型,使用字符串的形式保存小数,总长度最多65位,小数长度最多30位,整数长度最多35位
"""默认存在四舍五入"""create table t2(f1 float(5,2) , f2 double(5,2) , f3 decimal(5,2));insert into t2 values(1.77777777777777777777777777,1.77777777777777777777777777,1.77777777777777777777777777);

"""float 默认小数保留5位,double小数位截取16位,decimal(10,0) 默认保留整数,存在四舍五入"""create table t3(f1 float,f2 double ,f3 decimal); insert into t3 values(1.77777777777777777777777777,1.77777777777777777777777777,1.77777777777777777777777777);

字符串类型

char 字符长度 255个varchar 字符长度 21845个 (注意:总字节数不超过65535)char(11) 定长 : 固定开辟11个字符长度的空间(手机号,身份证号,银行卡), 开辟空间速度上char速度更快varchar(11) 变长 : 最多开辟11个字符长度的空间(评论,消息留言,地址), 开辟速度相较于char慢一点.text 文本类型,存论文,小说,文章..
 create table t5(c char(11), v varchar(11) , t text);insert into t5 values('22222',"33333","44444");insert into t5 values('22222',"33333333333333333333","44444");  # error# concat 拼接任意长度的字符串select concat(c,":",v,":",t) from t5;# mysql 中函数select user()select concat()select concat(参数1,参数2,参数3 , ... ) 把所有的参数拼接在一起

枚举和集合

enum 枚举 : 从列出来的数据当中选一个,比如性别

set 集合 : 从列出来的数据当中选多个(自动去重),比如爱好

create table t6(id int,name varchar(10),money float(6,3),sex enum("男性","女性","禽兽","人妖","雌雄同体","半兽人","阿凡达"),hobby set("吃肉","抽烟","喝酒","喝假酒"));# 正常insert into t6(id , name ,money , sex , hobby) values(1,"克拉伊买买提",56.7891,"半兽人","喝假酒,抽烟");# 自动去重insert into t6(id , name ,money , sex , hobby) values(1,"克拉伊买买提",56.7891,"半兽人","喝假酒,抽烟,抽烟,抽烟,抽烟");

时间类型

date  YYYY-MM-DD 年月日 (节假日,纪念日)time  HH:MM:SS   时分秒 (体育竞赛,记录时间)year  YYYY       年份   (历史,酒的年份)datetime  YYYY-MM-DD HH:MM:SS  年月日 时分秒 (上线时间,下单时间)
``
```python
create table t1(d date , t time , y year , dt datetime);
insert into t1 values("2020-08-25","08:25:30","2020","2020-08-25 08:25:30")
insert into t1 values(now(),now(),now(),now())

timestamp YYYYMMDDHHMMSS(时间戳)

自动更新时间(不需要手动,系统自动更新时间) 数据上一次的修改时间

create table t2(dt datetime , ts timestamp);
insert into t2 values(null,null);
insert into t2 values(20200825082530,20200825082530);
insert into t2 values(20200825082530,20380825082530); # error 不能超过2038年的某一年

约束

约束关键字

unsigned 无符号not null 不为空default 设置默认值unique 唯一约束,数据唯一不重复primary key 主键,标记数据的唯一特征(唯一且不为空)auto_increment 自增加1(一般配合主键使用, 或 unique进行自增)zerofill 零填充(配合整型int使用) int(11) , 位数不够11位,拿0补充foreign key 外键,把多张表通过一个关联字段联合在一起,(这个字段可以加外键)

unsigned 无符号

# unsigned      无符号
create table t3(id int unsigned);
insert into t3 values(100);
insert into t3 values(-100); error

not null 不为空

# not null      不为空
create table t4(id int not null , name varchar(255));
insert into t4 values(1,"宋云杰");
insert into t4 values(null,"宋云杰"); # error id不可为空
insert into t4(name) values('abc');  # error id不可为空

default 设置默认值

# default       设置默认值
create table t5(id int not null,name varchar(255) default '高雪峰');
insert into t5 values(1,null);
insert into t5(id) values(2);

unique 唯一约束,数据唯一不重复

索引:相当于字典的目录,通过索引可以加快查询的速度

UNI 唯一索引,允许插入NULL空值

create table t6(id int unique , name varchar(255) default '戈隆');
insert into t6(id) values(1);
insert into t6(id) values(1); # error id是唯一约束,不能有两个1
insert into t6(id) values(null);
insert into t6(id) values(null);

primary key 主键,标记数据的唯一特征(唯一且不为空)

PRI 主键 非空且唯一 在一个表里只能有一个主键

not null unqiue约等于primary key

create table t7(id int not null unique , name varchar(255) default '戈隆');
insert into t7 values(1,"1122")
insert into t7 values(null,"1122") # error id不能为空


primary key 创建主键

create table t8(id int primary key , name varchar(255) default 'libolun' );
insert into t8 values(1,"ppp")


两者同时存在 (优先显示primary key 作为主键,另一个设置成UNI 唯一索引)

create table t9(id int primary key , name char(3) not null unique);


一个表里只能有一个主键

create table t10(id int primary key , name char(3) primary key); error

auto_increment 自增加1(一般配合主键使用, 或 unique进行自增)

create table t11(id int primary key auto_increment , name varchar(255) default 'Alan')
insert into t11 values(1,"Wuming")
insert into t11 values(null,"Huahai")
insert into t11(id) values(null)
# 使用默认值自动插入
insert into t11 values()# delete 只删除数据,id号保留
delete from t11 ;
# truncate 删除所有数据 + 重置id
truncate table t11;

zerofill 零填充(配合整型int使用) int(11) , 位数不够11位,拿0补充

    create table t12(id int(8) zerofill);insert into t12 values(2)insert into t12 values(123456789)

主键索引 PRI &唯一索引 UNI &普通索引 MUL

联合唯一约束

概念:字段都设置成not null + unique 显示PRI , 联合在一起表达一种唯一性

格式:unique(字段1,字段2,字段3 … ) 把多个字段拼在一起表达唯一的数据

    create table t1_server(id int , name varchar(255) not null,ip char(15) not null,port int not null , unique(ip,port));insert into t1_server values(1,"aaa","192.168.1.1",3306);insert into t1_server values(1,"aaa","192.168.1.1",3306); # error ip,port为联合唯一索引,不可重复insert into t1_server values(1,"aaa","192.168.1.1",443); insert into t1_server values(1,"aaa","192.168.1.255",443);

联合唯一约束(字段不设置成not null)

    create table t2_server(id int ,name varchar(255) not null,ip char(15) ,port int , unique(ip,port));insert into t2_server values(1,"aaa","192.168.65.135",3306);insert into t2_server values(1,"aaa",null,null); # 注意点,允许插入多个空值;insert into t2_server values(1,"aaa",null,null);insert into t2_server values(1,"aaa",null,null);insert into t2_server values(1,"aaa",null,null);insert into t2_server values(1,"aaa",null,null);

联合唯一索引和主键之间是否可以同时存在?

unique(ip,port) 联合唯一索引primary key(ip,port) 联合主键这两个用法一模一样,区别:前者可以继续添加一个主键,后者不能再额外添加主键主键可以是单个字段,也可以是联合主键,设置多个单字段做主键不行的.
create table t3_server(id int , name varchar(255) not null,ip char(15) not null,port int not null , unique(ip,port));


如果现在设置id是主键

alter table t3_server add primary key(id);

外键:foreign key

外键:把多张表通过一个关联字段联合在一起,(这个字段可以加外键) [可设置成联级更新和删除]

要注意的是:外键所关联的其他字段必须具有唯一属性 unique 或者 primary key
创建class表:

    # 创建class1create table class1(id int , classname varchar(255))# 删除索引alter table class1 drop index id# 添加索引alter table class1 add unique(id);


创建student表,并且在class1表和student1表中添加数据

    # 创建student1create table student1(id int primary key auto_increment, name varchar(255), age int , classid int,foreign key(classid) references class1(id));# 添加数据insert into class1 values(1,"python30");insert into class1 values(2,"python31");    insert into class1 values(3,"python32");insert into student1 values(null,"yuanweizhuo",88,2);insert into student1 values(null,"lihuling",99,2);insert into student1 values(null,"wangwen",18,3);# 删除class1里面的python31这个班级  (报错删不掉,因为有其他数据关联该班级)delete from class1 where id = 2;# 需要先把关联的其他数据都删掉之后再删,才能成功delete from student1 where id = 1;delete from student1 where id = 2;

在外键中设置联级删除和联级更新

联级删除 on delete cascade联级更新 on update cascade
    # 创建class2create table class2(id int unique , classname varchar(255))    ;# 创建student2create table student2(id int primary key auto_increment, name varchar(255), age int , classid int,foreign key(classid) references class2(id) on delete cascade on update cascade);# 添加数据insert into class2 values(1,"python30");insert into class2 values(2,"python31");    insert into class2 values(3,"python32");insert into student2 values(null,"yuanweizhuo",88,2);insert into student2 values(null,"lihuling",99,2);insert into student2 values(null,"wangwen",18,3);# 联级删除delete from class2 where id = 2# 联级更新update class2 set id = 100  where classname = "python32";

表和表之间的关系

1.一对一 : 表1 id z1 z2 z3 … 表2 id z4 z5 z6 (可以设置z3为关联字段且唯一 , 关联表2中的唯一一个id)

2.一对多 或者 多对一 : 一个班级里面可以由多个学生,在学生表中创建一个关联字段,关联班级,把关联字段设置成外键,去存储班级的id

3.多对多 : 一个学生可以学习多个学科,一个学科也可以被多个学生学习。一本书可以被多个作者共同撰写,一个作者也可以写多本书.

如果表和表是多对多的话,需要注意设置第三张关系表

存储引擎

概念

show engines:查看所有的存储引擎

概念:1.表级锁: 如果有人修改当前这个表,会直接上锁,其他用户无法进行修改,不能进行高并发.2.行级锁: 如果有人修改当前这个表中的一条记录,当前这条数据会被锁定,其他数据仍然可以被修改,速度快,允许高并发3.事务处理: 执行sql语句时,必须所有的操作全部成功,最终提交数据,否则数据回滚,回到刚开始没操作的那个状态.begin : 开启事务commit: 提交数据rollback: 回滚数据常见的四种存储引擎:1.MyISAM : 支持表级锁(5.6版本前默认存储引擎)2.InnoDB : 事务处理,行级锁,外键(5.6版本后默认存储引擎)3.MEMORY : 把数据放在内存中,做一个临时的缓存4.BLACKHOLE : 黑洞,产生binlog日志,不产生真实数据用来同步主从数据库中的数据,场景发生在多服务器集群中 (一主一从,一主多从,主数据库:增删改,从数据库:查)

语法

用这四种引擎创建表时,所生成的文件是不一样的:

'''create table myisam1(id int , name varchar(255)) engine = MyISAM;'''
# myisam1.frm  表结构
# myisam1.MYD  表数据
# myisam1.MYI  表索引'''create table innodb1(id int , name varchar(255)) engine = InnoDB;'''
# innodb1.frm  表结构
# innodb1.ibd  表数据 + 表索引'''create table memory1(id int , name varchar(255)) engine = MEMORY;'''
# memory1.frm 表结构
没有数据文件的,因为所有的数据都临时存储在内存之中'''create table blackhole1(id int , name varchar(255)) engine = BLACKHOLE;'''
# blackhole1.frm 表结构
内存中不存储任何值

关于约束的添加和删除

# 关于约束的添加和删除
# 1 添加/删除 约束 not null#alter table 表名 modify 字段名 类型alter table t1 modify id int not nullalter table t1 modify id int# 2 添加/删除 unique 唯一索引# alter table 表名 add unique(id)alter table t1 add unique(id)alter table t1 drop index id# 3 添加/删除 primary key# alter table 表名 add primary key(id);alter table t1 add primary key(id);alter table t1 drop primary key;# 4 添加/删除 foreign key 外键 (show create table student1 找到外键名字,然后再删)alter table student1 drop foreign key student1_ibfk_1; #删除alter table student1 add foreign key(classid) references class1(id) #添加

MySQL数据类型、约束、外键、索引、存储引擎相关推荐

  1. mysql外键的存储引擎_10.mysql存储引擎

    2.1 存储引擎概述 和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎. 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 .存储引擎 ...

  2. MySQL的约束——外键约束

    约束: MySQL的约束的概述: 概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据 目的: 保证数据库中数据的正确,有效和完整性 分类 1.非空约束 NOT NULL 限制该字段的数据不 ...

  3. 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎

    1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...

  4. ruhr启动mysql数据库_Mysql表类型(存储引擎)的选择

    以下内容转载自:https://www.cnblogs.com/jswang/p/6923911.html 7.1 mysql存储引擎概述 插件式存储引擎是mysql数据库最重要的特性之一,用户可以根 ...

  5. oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE

    在项目中,我们一般在数据库设计的时候做主外键关联设计,要么就不做.但是这样不符合规范,呵呵. 建立主外键关系的时候,默认是不能级联删除的.而出现往往在删除主表的数据时报错, 需要先删除从表然后再删除主 ...

  6. mysql各版本的默认的存储引擎_Mysql常见的几种存储引擎

    一.mysql的体系结构 整个MysqlServer有一下几部分组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服 ...

  7. mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)

    数据类型 1. 数字(默认都是由符号,宽度表示的是显示宽度,与存储无关).tinyint 括号里指定宽度 七位2进制数最大数就是2**7 -1=127 最小是-128 验证: create tabel ...

  8. mysql不能删除外键吗,MySQL不能删除外键约束所需的索引

    MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...

  9. MySQL学习笔记(五)—— 索引存储引擎

    索引&存储引擎 一.MySQL存储引擎介绍 1.什么是数据库存储引擎 2.如何查看引擎 建表时指定引擎 修改表的引擎 **MyISAM和InnoDB的区别** 二.索引 1.什么是索引 2.索 ...

  10. 【MySQL进阶篇】一、存储引擎、索引

    文章目录 参考资料 前言 1. 存储引擎 1.1 简介 1.2 特点 1.2.1 InnoDB 1.2.2 MyISAM 1.2.3 Memory 1.2.4 小结 1.3 存储引擎选择 1.4 总结 ...

最新文章

  1. mysql upgrade help_【MySQL学生手册】MySQL的升级
  2. Python和OpenCV环境配置
  3. Html图片懒加载动画,Intersection Observer实现滚动到相应区域执行动画及图片懒加载...
  4. Blog小技巧之二-让朋友在Blog上也能QQ到自己
  5. 用perl语言求1到100之间的偶数,奇数及素数
  6. 新自动化文档生成-go语言-docx生成
  7. 金属商务本-戴尔Vostro成就3450评测
  8. sqlalchemy学习
  9. tornado SQLAlchemy
  10. linux nmon安装
  11. Linux基础命令---间歇性执行程序watch
  12. 国外稳定的免费PHP空间byethost.com
  13. 服务器主板的无线驱动,驱动天空 - 品牌主板 - 服务器主板 SERVER
  14. 关于拉勾网的scrapy crawlspider爬虫出现的302问题的解决方式
  15. 好玩又有趣的Python实例小游戏代码,我能在电脑上琢磨一天
  16. 超级详细-NMOS、PMOS的工作原理及相关内容整理(上)
  17. C++ - std::srand
  18. 微软认知服务应用秘籍 – 漫画翻译篇
  19. 第八次作业——MPEG音频编码
  20. kafka之重新分配分区副本kafka-reassign-partitions命令

热门文章

  1. 第十课:人口金字塔、漏斗图、箱线图
  2. SpringBoot系列:9. 分布式系统,Dubbo,Zookeeper服务注册与发现
  3. 充电桩设计之4G模块 AT命令通信封装接口
  4. Good software for pc
  5. 2018年西财在线计算机统考,2018年西财会计继续教育考试题.docx
  6. 前端setTimeout和setInterval定时器
  7. 前端HTML基础小练习-制作一个相亲表单
  8. maven 整合ueditor富文本编辑器
  9. 通过url地址批量打包zip下载文件
  10. BOSS直聘论文再次入选CIKM 2020,人岗匹配系统研究又现新突破