目录

part1:数据类型

part2:约束

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

part4:外键:foreign key

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

part6:表和表之间的关系

part7:存储引擎

part8:关于约束的添加和删除

part1:数据类型

date YYYY-MM-DD 年月日 (结婚纪念日,节假日)

time HH:MM:SS 时分秒 (体育竞赛)

year YYYY 年份值 (历史,酒的年份)

datetime YYYY-MM-DD HH:MM:SS 年月日 时分秒 (用户登录时间,下单时间)

  1. create table t1(d date , t time , y year , dt datetime);
  2. insert into t1 values("2020-08-25","08:25:30","","2020-08-25 08:25:30")
  3. insert into t1 values(now(),now(),now(),now())

t1表中内容如下所示

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

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

t2表中内容如下所示

part2:约束

unsigned 无符号

not null 不为空

default 设置默认值

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

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

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

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

foreign key 外键,把多张表通过一个关联字段联合在一起,(这个字段可以加外键)

1.unsigned 无符号

  1. # unsigned 无符号
  2. create table t3(id int unsigned);
  3. insert into t3 values(100);
  4. insert into t3 values(-100); error

下图是t3表的详情参数

2.not null 不为空

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

下图是t4表的详情参数

3.default 设置默认值

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

下图是t5表的详情参数

下图是t5表的存储内容

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

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

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

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

下图是t6表的详情参数

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

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

not null unqiue约等于primary key

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

下图是t7表的详情参数

2.primary key 创建主键

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

下图是t8表的详情参数

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

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

下图是t9表的详情参数

4.一个表里只能有一个主键

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

当创建表中有多个主键,会出现如下错误提示

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

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

下图是t11表的详情参数

下图是t11表的存储内容

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

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

下图是t12表的详情参数

下图是t12表中的存储内容

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

1.联合唯一约束(字段都设置成not null + unique 显示PRI , 联合在一起表达一种唯一性) 

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

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

下图是t1_server表的详情参数

下图是t1_server表的存储内容

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

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

下图是t2_server表的详情参数

下图是t2_server表的存储内容

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

unique(ip,port) 联合唯一索引

primary key(ip,port) 联合主键

这两个用法一模一样,区别:前者可以继续添加一个主键,后者不能再额外添加主键

主键可以是单个字段,也可以是联合主键,设置多个单字段做主键不行的.

  1. create table t3_server(id int , name varchar(255) not null,ip char(15) not null,port int not null , unique(ip,port));

现在t3_server表的详情参数是这样的

如果现在设置id是主键

  1. alter table t3_server add primary key(id);

part4:外键:foreign key

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

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

创建class表:

  1. # 创建class1
  2. create table class1(id int , classname varchar(255))
  3.  
  4. # 删除索引
  5. alter table class1 drop index id
  6.  
  7. # 添加索引
  8. alter table class1 add unique(id);

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

  1. # 创建student1
  2. create table student1(
  3. id int primary key auto_increment,
  4. name varchar(255),
  5. age int ,
  6. classid int,
  7. foreign key(classid) references class1(id)
  8. );
  9.  
  10. # 添加数据
  11. insert into class1 values(1,"python30");
  12. insert into class1 values(2,"python31");
  13. insert into class1 values(3,"python32");
  14.  
  15. insert into student1 values(null,"yuanweizhuo",88,2);
  16. insert into student1 values(null,"lihuling",99,2);
  17. insert into student1 values(null,"wangwen",18,3);
  18.  
  19. # 删除class1里面的python31这个班级 (报错删不掉,因为有其他数据关联该班级)
  20. delete from class1 where id = 2;
  21. # 需要先把关联的其他数据都删掉之后再删,才能成功
  22. delete from student1 where id = 1;
  23. delete from student1 where id = 2;

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

联级删除 on delete cascade

联级更新 on update cascade

  1. # 创建class2
  2. create table class2(id int unique , classname varchar(255)) ;
  3.  
  4. # 创建student2
  5. create table student2(
  6. id int primary key auto_increment,
  7. name varchar(255),
  8. age int ,
  9. classid int,
  10. foreign key(classid) references class2(id) on delete cascade on update cascade
  11. );
  12.  
  13. # 添加数据
  14. insert into class2 values(1,"python30");
  15. insert into class2 values(2,"python31");
  16. insert into class2 values(3,"python32");
  17.  
  18. insert into student2 values(null,"yuanweizhuo",88,2);
  19. insert into student2 values(null,"lihuling",99,2);
  20. insert into student2 values(null,"wangwen",18,3);
  21.  
  22. # 联级删除
  23. delete from class2 where id = 2
  24. # 联级更新
  25. update class2 set id = 100 where classname = "python32";

part6:表和表之间的关系

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

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

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

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

part7:存储引擎

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

一些相关的概念:

  1.表级锁: 如果有人修改当前这个表,会直接上锁,其他用户无法进行修改,不能进行高并发.

  2.行级锁: 如果有人修改当前这个表中的一条记录,当前这条数据会被锁定,其他数据仍然可以被修改,速度快,允许高并发

  3.事务处理: 执行sql语句时,必须所有的操作全部成功,最终提交数据,否则数据回滚,回到刚开始没操作的那个状态.

    begin : 开启事务

    commit: 提交数据

    rollback: 回滚数据

常见的四种存储引擎:

  1.MyISAM : 支持表级锁(5.6版本前默认存储引擎)

  2.InnoDB : 事务处理,行级锁,外键(5.6版本后默认存储引擎)

  3.MEMORY : 把数据放在内存中,做一个临时的缓存

  4.BLACKHOLE : 黑洞,产生binlog日志,不产生真实数据

         用来同步主从数据库中的数据,场景发生在多服务器集群中 (一主一从,一主多从,主数据库:增删改,从数据库:查)

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

  1. '''create table myisam1(id int , name varchar(255)) engine = MyISAM;'''
  2. # myisam1.frm 表结构
  3. # myisam1.MYD 表数据
  4. # myisam1.MYI 表索引
  5.  
  6. '''create table innodb1(id int , name varchar(255)) engine = InnoDB;'''
  7. # innodb1.frm 表结构
  8. # innodb1.ibd 表数据 + 表索引
  9.  
  10. '''create table memory1(id int , name varchar(255)) engine = MEMORY;'''
  11. # memory1.frm 表结构
  12. 没有数据文件的,因为所有的数据都临时存储在内存之中
  13.  
  14. '''create table blackhole1(id int , name varchar(255)) engine = BLACKHOLE;'''
  15. # blackhole1.frm 表结构
  16. 内存中不存储任何值

part8:关于约束的添加和删除

  1. # 关于约束的添加和删除
  2. # 1 添加/删除 约束 not null
  3. #alter table 表名 modify 字段名 类型
  4. alter table t1 modify id int not null
  5. alter table t1 modify id int
  6.  
  7. # 2 添加/删除 unique 唯一索引
  8. # alter table 表名 add unique(id)
  9. alter table t1 add unique(id)
  10. alter table t1 drop index id
  11.  
  12. # 3 添加/删除 primary key
  13. # alter table 表名 add primary key(id);
  14. alter table t1 add primary key(id);
  15. alter table t1 drop primary key;
  16.  
  17. # 4 添加/删除 foreign key 外键 (show create table student1 找到外键名字,然后再删)
  18. alter table student1 drop foreign key student1_ibfk_1; #删除
  19. alter table student1 add foreign key(classid) references class1(id) #添加

day38:MySQL数据库之约束&索引&外键&存储引擎的更多相关文章

  1. 总结: MySQL(基础,字段约束,索引,外键,存储过程,事务)操作语法

    1. 显示数据库列表 show databases; # 查看当前所有数据库 show databases \G   #以行的方式显示 2. 在命令行中,执行sql语句 mysql -e 'show ...

  2. 2-16 MySQL字段约束-索引-外键

    一:字段修饰符 1:null和not null修饰符 我们通过这个例子来看看 mysql> create table worker(id int not null,name varchar(8) ...

  3. mysql字段约束-索引-外键---3

    本节所讲内容: 字段修饰符 清空表记录 索引 外键 视图 一:字段修饰符 (约束) 1:null和not null修饰符   我们通过这个例子来看看 mysql> create table wo ...

  4. MySQL数据库~~~~~存储引擎

    1. InnoDB InnoDB引擎特点: 1.支持事务:支持4个事务隔离界别,支持多版本读. 2.行级锁定(更新时一般是锁定当前行):通过索引实现,全表扫描仍然会是表锁,注意间隙锁的影响. 3.读写 ...

  5. MySQL数据库之-foreign key 外键(一对多、多对多、一对一)、修改表、复制表

    摘要: 外键 一对多 外键 多对多 外键 一对一 --------------------------------------------------------------------------- ...

  6. mysql(视图 事务 索引 外键)

    视图   视图本质就是对查询的封装   创建视图(定义视图 起名以v_开头) create view v_students as select classes.name as c_name ,stud ...

  7. MySQL数据库--外键约束及外键使用

    什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

  8. MySQL创建表时加入的约束以及外键约束的的意义

    1,创建表时加入的约束 a) 非空约束,not null b) 唯一约束,unique c) 主键约束,primary key d) 外键约束,foreign key 1,非空约束,针对某个字段设置其 ...

  9. MySQL删除所有表的外键约束、禁用外键约束

    转: MySQL删除所有表的外键约束.禁用外键约束 2017年10月27日 00:11:34 李阿飞 阅读数:4512   版权声明:本文为博主原创文章,未经博主允许不得转载. https://blo ...

随机推荐

  1. PHP mysqli_sqlstate() 函数

    返回最后一个 MySQL 操作的 SQLSTATE 错误代码: <?php 高佣联盟 www.cgewang.com // 假定数据库用户名:root,密码:123456,数据库:RUNOOB ...

  2. js数组常用api

    数组创建 第一种,使用 Array 构造函数: var arr1 = new Array(); //创建一个空数组 var arr2 = new Array(10); // 创建一个包含10项的数组 ...

  3. MapReduce之GroupingComparator分组(辅助排序、二次排序)

    指对Reduce阶段的数据根据某一个或几个字段进行分组. 案例 需求 有如下订单数据 现在需要找出每一个订单中最贵的商品,如图 需求分析 利用"订单id和成交金额"作为key,可以 ...

  4. .Net小白的第一篇博文

    说起来也比较惭愧,5个月之前,我早已创建了博客园账号,那时候的我雄心壮志,给自己定下了 很多目标.现在回想起来,除了体重的增长,头发的稀疏,似乎这段时间的消逝并没有带给我什么见识上的成长.哈哈,想必大 ...

  5. 【SDOI2012】Longge 的问题 题解(欧拉函数)

    前言:还算比较简单的数学题,我这种数学蒟蒻也会做QAQ. --------------- 题意:求$\sum\limits_{i=1}^n gcd(i,n)$的值. 设$gcd(i,n)=d$,即$d ...

  6. 深度学习论文翻译解析(十二):Fast R-CNN

    论文标题:Fast R-CNN 论文作者:Ross Girshick 论文地址:https://www.cv-foundation.org/openaccess/content_iccv_2015/p ...

  7. 极简 Node.js 入门 - 1.2 模块系统

    极简 Node.js 入门系列教程:https://www.yuque.com/sunluyong/node 本文更佳阅读体验:https://www.yuque.com/sunluyong/node ...

  8. “随手记”开发记录day06

    今天还是继续完成统计页面,完成的按钮有支出大头和收入来源的饼状图, 由于之前写过相关的代码,这次的任务对我们来说还挺简单的,没有出现什么太大的问题,

  9. CentOS7安装Redis的两种方式

    1. 源码安装方式(不推荐): https://www.cnblogs.com/zuidongfeng/p/8032505.html https://www.cnblogs.com/zerotomax ...

  10. JS 弹出框拖拽

    css代码 body { margin:; text-align: center; } .box { display: none; background-color: #fff !important; ...