python_learn时间类型、约束、表间关系及存储

# 先讲了char 、 varchar的补充# 进入第一部分,讲了时间这个数据类型 都有不同的应用场景
data	YYYY-MM-DD
time    HH:MM:SS
year	YYYY
datetime	YYYY-MM-SS HH:MM:SS
timestamp	# 开始讲例子创建了db0617
datetimecreate table t5(d date, t time, y year, dt datetime);insert into t5 values("2020-06-17","09:15:39","2020","2020-06-17 09:15:39");insert into t5 values(now(),now(),now(),now());timestamp YYYYMMDDHHMMSS  可以自动更新时间,不需要手动写入,修改数据的时候,记录最后一次修改时间create table t6(dt datetime, ts timestamp);insert into t6 values(null,null)insert into t6 values(20200617092430,20200617092430)	# 这能随便写时间吗,为什么说时间戳总有一天会不用的,2038年的某一天,会有新的方式来取代now 获取当前时间,select now()"""记笔记,不要操作。你跟不上"""# 进入第二部分 ,约束 :对编辑的数据进行类型限制,不满足约束条件的直接报错unsigned	无符号not null	不能为空default		设置默认值unique		唯一约束/索引 , 数据唯一不能重复primary key  主键,标记某一条数据的唯一特征(唯一且不为空的数据)auto_increment	自增加1 (一般配合主键使用,或者unique进行自增)zerofill	0填充,配合int类型使用,比如int6),位数不够6位,拿0来补充foreign key	外键,把多张表通过一个关联字段,联合在一起# 下面开始进行演示
1.unsignedcreate table t7(id int unsigned);insert into t7 values(66);insert into t7 values(-66);		error2.not nullcreate table t8(id int not null, name varchar(255))# 无脑塞个255,代表255字符,不要超过28245,当我们不知道需要限制多少数据长度的时候desc t8insert into t8 values(1,"xx");select * from t8;insert into t8 values(null,"xx");	errorinsert into t8(name) values("xx");	error3.defaultcreate table t9(id int not null, name varchar(255) default "xboy");desc t9;insert into t9 values(1,null);select * from t9;insert into t9(id) values(1);4.unique
"""
索引:相当于字典的目录,通过索引可以加快我们的查询速度;索引的创建会增加文件大小
适当的索引对我们有利
UNI:唯一索引,允许塞空值,所以我们出现了主键,主键不允许塞空值,且唯一
"""create table t10(id int unique,name char(10) default "liuwei");desc t10;insert into t10(id) values(1);select * from t10;insert into t10(id) values(1);select * from t10;		# error 违背UNIinsert into t10(id) values(12);insert into t10(id) values(null);	# 不报错 ,unique允许塞入空值5.primary key	主键,标记某一条数据的唯一特征(唯一且不为空的数据)# (创建表:字段,类型,约束 。。。)create table t11(id int not null unique, name char(10) default "liuwei")# PRI 主键不允许塞空值,且唯一,在一个表中,只能有一个字段是主键insert into t11 values(1,"nihao");insert into t11 values(null,"nihaoa");		# error# primary key创建主键caeate table t12(id int primary key, name char(10) default "liuwei");desc t12;insert into t12 values(1,"aaa");# 如果两者同时存在,一个表里只能有一个主键,否则报错create table t13(id int primary key, name char(10) not null unique);	# successdesc t13; 	# primary key 的优先级更高, not null unique 被标记成uni,即唯一索引6.auto_increment create table t14(id int primary key auto_increment, name char(10) default "xiechen");desc t14;insert into t14 values(1,"zhangsan");select * from t14;insert into t14 values(null,"wangwen");		# 自增加1,方便insert into t14(id) values(null);select * from t14;insert into t14 values();	# 使用默认值进行插入select * from t14;# delete(单纯删除数据) truncate 的区别delete from t14;select * from t14;insert into t14 values(null);	# delect删除后,再添加的数据,继续上次的id往下数# truncate 删除就是重置id(重置表)truncate table t14;7.zerofillcreate table t15(id int6)zerofill);		# int后面的数字表示填充数字的长度,不够6为拿0补充desc t15;insert into t15 values(2);insert into t15 values(2222);insert into t15 values(2222222222);# part3 
# 1.联合唯一约束(都为非空的字段,显示的PRI,联合在一起做的主键):unique(字段1,字段2,字段3...) 把多个字段拼在一起,表达唯一的数据"""MUL 代表普通索引UNI 唯一索引、PRI 主键索引"""create table t1_server(id int primary key auto_increment, server_name char(10) not null, ip char(15) not null, port int not null,unique(ip,port));insert into t1_server values(null,"aaa","182.168.56.31",5000);desc t1_server;192.168.56.31 5000192.168.56.31 6000192.168.56.40 6000192.168.56.31 5000	# 不再存了# 2.联合唯一约束(为空的字段,允许插入null,显示MUL)	单个的重复没关系create table t2_server(id int, server_name char(10) not null, ip char(15), port int,unique(ip,port));insert into t2_server values(1,"aaa","182.168.56.31",5000);insert into t2_server values(1,"aaa",null,null)desc t1_server;# 3.联合唯一索引MUL和主键PRI可不可以同时存在create table t1_server(id int, server_name char(10) not null, ip char(15) not null, port int not null,unique(ip,port));slter table t3_server add primary key(id);unique(ip,port)		# 联合唯一索引primary key(ip,port)	# 联合唯一主键# 这两个用法一致,区别是:前者可以继续添加一个主键,而后者不能再添加了# 主键只能是单个字段,或者联合主键,如果再加就会报错8.foreign key 把多张表通过一个关联字段,联合在一起"""外键的要求:要求关联的字段必须具有一个唯一属性(unique或者primarykey)"""studentid		name 	age		classname 	address1		wang	80		py30		beijing12		lin		800		py30		dongbei3		wen		18		py31		neimenggu# 为了避免出现过多的字段,可以采用分表的形式,来提升效率,减小数据冗余student1 id		name 	age		address		classid1		wang	80		beijing1	12		lin		800		dongbei		13		wen		18		neimenggu	2class1:id		classname		detetime1		python30		2020-01-01 09:09:092		python31		2020-03-01 09:09:09# 创建class1表create table class1(id int, classname varchar(255));# 被关联字段需要具有唯一属性alter table class1 add unique(id);# 创建student1表create table student1(id int primary key auto_increment,name varcahr(255)not null,age int not null,classid int,foreign key(classid) references class1(id));# 把class1设置成外键insert into class1 values(1,"python30");insert into class2 values(2,"oython31");insert into student1 values(null,"wang",80,2);insert into student1 values(null,"xiao",800,1);insert into student1 values(null,"wen",18,2);# 删除class1,如果这条数据在其他表里存在,直接删除会报错,因为外键的关联限制;需要先把关联的数据都删掉,之后才可真正的删掉这条数据delete from class1 where id = 1;		# error# 如果被标记成外键,有彼此相交的数据,是不允许删除的delete from student1 where id = 2;delete from class1 where id = 1;		# success# 联级删除 联级更新(谨慎操作)"""练级删除 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 varcahr(255)not null,age int not null,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,"oython31");insert into student2 values(null,"wang",80,2);insert into student2 values(null,"xiao",800,1);insert into student2 values(null,"wen",18,2);# 练级删除delete from class2 where id = 2;# 练级更新update class2 set id = 100 where classname = "python";# part4 这里讲一讲表间关系1.一对一	表一很长,把表一切成2两个,然后关联字段,两张表凑在一起	2.一对多	一个班级里面可以对应多个学生,可以把学生作为主动关联的表,后面关联班级的字段3.多对多	一个学生可以对应多个学科,一个学科也可以被多个学生学习xueke  表1
id		name
1		math
2		english
3		wulistudent		表2
id		name
1		xboy
2		wei
3		wang# 表达多对多关系时,需要第三章关系表,单纯的存关系
relation	表3		把xid 和 sid 设置成外键,用多的关联少的,把少的字段作为关联字段
关联xueke的id,和student的idxid		sid
1		1
1		2	
1		3
2		1
2		2
2		3
3		1
3		2
3		3# part5 存储引擎		跟上面都没啥关系了
存储引擎是存储数据的结构方式
show engines;	查看存储引擎# 概念理解:
1.表级锁:如果有人修改当前这个表,会直接上表锁,其他人无法修改;在编辑数据时,速度慢,不能高并发
2.行级锁:如果有人修改当前表中的一条记录,只对当前这条记录数据上锁,不影响其他人修改其他条数据;速度快,允许高并发
3.事务处理:如果执行sql语句,在全部成功之后,再选择提交数据,有一条失败,立刻回滚,恢复到原来状态begin:开始事务commit:提交数据rollback:回滚数据	删的表或者库回滚也不好使InnoDB:5.6版本后的默认存储引擎,支持事务处理,行级锁,外键
MEMORY:把数据放在内存中,用作缓存
BLACKHOLE:黑洞,用来同步主从数据库中的数据,场景发生在服务器并发集群(主数据库:查询;从数据库:增删改)主从之间加个黑洞
MyISAM:5.6版本前的默认存储引擎,支持表级锁create table myisam1(id int,name char()) engine = myisam;create table innodb1(id int ,name char(10)) engine = innodb;innodb1.frm	 表结构innodb1.ibd  表数据+表索引负载均衡系统,动态分配服务器
底层算法,取余。保证每个服务器并发压力相对均衡


本文来自互联网用户投稿,文章观点仅代表作者本人,不代表本站立场,不承担相关法律责任。如若转载,请注明出处。 如若内容造成侵权/违法违规/事实不符,请点击【内容举报】进行投诉反馈!

相关文章

立即
投稿

微信公众账号

微信扫一扫加关注

返回
顶部