MySQL数据类型、约束、外键、索引、存储引擎
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 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数据类型、约束、外键、索引、存储引擎相关推荐
- mysql外键的存储引擎_10.mysql存储引擎
2.1 存储引擎概述 和大多数的数据库不同, MySQL中有一个存储引擎的概念, 针对不同的存储需求可以选择最优的存储引擎. 存储引擎就是存储数据,建立索引,更新查询数据等等技术的实现方式 .存储引擎 ...
- MySQL的约束——外键约束
约束: MySQL的约束的概述: 概念: 约束是作用于表中字段上的规则,用于限制存储在表中的数据 目的: 保证数据库中数据的正确,有效和完整性 分类 1.非空约束 NOT NULL 限制该字段的数据不 ...
- 超详细图解!【MySQL进阶篇】SQL优化-索引-存储引擎
1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理 ...
- ruhr启动mysql数据库_Mysql表类型(存储引擎)的选择
以下内容转载自:https://www.cnblogs.com/jswang/p/6923911.html 7.1 mysql存储引擎概述 插件式存储引擎是mysql数据库最重要的特性之一,用户可以根 ...
- oracle+cascade=gt;true,mysql数据库主外键级联删除脚本RESTRICT -- CASCADE
在项目中,我们一般在数据库设计的时候做主外键关联设计,要么就不做.但是这样不符合规范,呵呵. 建立主外键关系的时候,默认是不能级联删除的.而出现往往在删除主表的数据时报错, 需要先删除从表然后再删除主 ...
- mysql各版本的默认的存储引擎_Mysql常见的几种存储引擎
一.mysql的体系结构 整个MysqlServer有一下几部分组成 Connection Pool : 连接池组件 Management Services & Utilities : 管理服 ...
- mysql中约束由数字构成_MySQL 数据类型和约束(外键是重点)
数据类型 1. 数字(默认都是由符号,宽度表示的是显示宽度,与存储无关).tinyint 括号里指定宽度 七位2进制数最大数就是2**7 -1=127 最小是-128 验证: create tabel ...
- mysql不能删除外键吗,MySQL不能删除外键约束所需的索引
MySQL不能删除外键约束所需的索引 我需要改变现有的数据库添加一列. 因此我也想更新UNIQUE字段来包含这个新列. 我试图删除当前的索引,但不断收到错误MySQL Cannot drop inde ...
- MySQL学习笔记(五)—— 索引存储引擎
索引&存储引擎 一.MySQL存储引擎介绍 1.什么是数据库存储引擎 2.如何查看引擎 建表时指定引擎 修改表的引擎 **MyISAM和InnoDB的区别** 二.索引 1.什么是索引 2.索 ...
- 【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 总结 ...
最新文章
- mysql upgrade help_【MySQL学生手册】MySQL的升级
- Python和OpenCV环境配置
- Html图片懒加载动画,Intersection Observer实现滚动到相应区域执行动画及图片懒加载...
- Blog小技巧之二-让朋友在Blog上也能QQ到自己
- 用perl语言求1到100之间的偶数,奇数及素数
- 新自动化文档生成-go语言-docx生成
- 金属商务本-戴尔Vostro成就3450评测
- sqlalchemy学习
- tornado SQLAlchemy
- linux nmon安装
- Linux基础命令---间歇性执行程序watch
- 国外稳定的免费PHP空间byethost.com
- 服务器主板的无线驱动,驱动天空 - 品牌主板 - 服务器主板 SERVER
- 关于拉勾网的scrapy crawlspider爬虫出现的302问题的解决方式
- 好玩又有趣的Python实例小游戏代码,我能在电脑上琢磨一天
- 超级详细-NMOS、PMOS的工作原理及相关内容整理(上)
- C++ - std::srand
- 微软认知服务应用秘籍 – 漫画翻译篇
- 第八次作业——MPEG音频编码
- kafka之重新分配分区副本kafka-reassign-partitions命令
热门文章
- 第十课:人口金字塔、漏斗图、箱线图
- SpringBoot系列:9. 分布式系统,Dubbo,Zookeeper服务注册与发现
- 充电桩设计之4G模块 AT命令通信封装接口
- Good software for pc
- 2018年西财在线计算机统考,2018年西财会计继续教育考试题.docx
- 前端setTimeout和setInterval定时器
- 前端HTML基础小练习-制作一个相亲表单
- maven 整合ueditor富文本编辑器
- 通过url地址批量打包zip下载文件
- BOSS直聘论文再次入选CIKM 2020,人岗匹配系统研究又现新突破