Python全栈之学习MySQL(1)

目录
  • 1. mysql约束
  • 2. 外键_联合主键_唯一索引
  • 3. 存储引擎_表关系
  • 总结

1. mysql约束

# ### char varchar (补充)
char    字符长度   255个
varchar 字符长度 21845个
# ### part1  时间类型
date  YYYY-MM-DD 年月日 (节假日,纪念日)
time  HH:MM:SS   时分秒 (体育竞赛,记录时间)
year  YYYY       年份   (历史,酒的年份)
datetime  YYYY-MM-DD HH:MM:SS  年月日 时分秒 (上线时间,下单时间)
	create table t1(d date, t time , y year , dt datetime);
	insert into t1 values("2020-11-3","9:19:30","2020","2020-11-3 9:19:30");
	insert into t1 values(now(),now(),now(),now());
timestamp YYYYMMDDHHMMSS(时间戳)  自动更新时间 (不需要手动写入,自动实现更新记录,[用作记录修改的时间])
	create table t2(dt datetime , ts timestamp);
	insert into t2 values(20201103092530 , 20201103092530);
	insert into t2 values(null,null); # 区别 timestamp 自动更新时间(以当前时间戳) datetime没有
	insert into t2 values(20390102101010 , 20390102101010); error # 超越2038
# ### part2 约束 : 对编辑的数据进行类型的限制,不满足约束条件的报错
	unsigned   :    无符号
	not null   :    不为空
	default    :    默认值
	unique     :    唯一值,加入唯一索引
	(索引相当于字典目录,索引的提出是为了加快速度,一味地乱加索引不会提高查询效率)
	primary key:    主键
	auto_increment: 自增加一
	zerofill   :    零填充
	foreign key:    外键
# unsigned 无符号
	create table t3(id int unsigned);
	insert into t3 values(-1); error
	insert into t3 values(4000000000); success

# not null   :    不为空
	create table t4(id int not null , name varchar(11));
	insert into t4 values(1,"张宇");
	insert into t4 values(null,"张宇"); error
	insert into t4(name) values("李四"); error

# default    :    默认值
	create table t5(id int not null  , name varchar(11) default "沈思雨" );
	insert into t5 values(1,null);
	insert into t5(id) values(2);
	create table t5_2(id int not null  default "1111" , name varchar(11) default "沈思雨" );
	insert into t5_2 values(); # 在values里面不写值,默认使用默认值;

# unique     :    唯一值,加入唯一索引(索引的提出是为了加快速度,一味地乱加索引不会提高查询效率)
	# 唯一 可为null  标记成: UNI
	create table t6(id int unique , name char(10) default "赵万里" );
	insert into t6(id) values(1);
	insert into t6(id) values(1); error
	insert into t6(id) values(null);
	insert into t6(id) values(null); # id变成了多个null
# primary key:    主键 [ 唯一 + 不为null ]   PRI 标记数据的唯一特征
	"""一个表中,只能设置一个字段为一个主键,unique唯一约束可以设置多个"""
	# 创建主键
	create table t7(id int primary key , name varchar(10) default "赵沈阳");
	insert into t7(id) values(1);
	insert into t7(id) values(1); error
	insert into t7(id) values(null); error
	# unique + not null => PRI
	create table t8(id int unique not null ,  name varchar(10) default "赵沈阳" );
	# primary key  / unique + not null  => 优先把primary key 作为主键;
	create table t9(id1 int unique not null ,  id2 int primary key );
	# 一个表只能设置单个字段为一个主键;
	create table t10(id1 int  primary key  ,  id2 int primary key ); error

# auto_increment: 自增加一 (一般配合 主键或者unique 使用)
	create table t11(id int primary key auto_increment , name varchar(255) default "敬文栋");
	insert into t11 values(1,"张三");
	insert into t11 values(null,"李四");
	insert into t11(id) values(null);
	# 使用默认值或者自增插入数据
	insert into t11 values();
	# 删除数据
	delete from t11;
	# 删除数据 + 重置id
	truncate table t11;

# zerofill   :    零填充 (配合int使用,不够5位拿0来填充)
	create table t12(id int(5) zerofill);
	insert into t12 values(1234567);
	insert into t12 values(12);

2. 外键_联合主键_唯一索引

# ### part3"""主键索引 : PRI    [primary key]唯一索引 : UNI    [unique]普通索引 : MUL    [index]"""# 1.联合唯一索引"""unique(字段1,字段2,字段3 ..... )  合在一起,该数据不能重复"""# unique + not nullcreate table t1_server(id int , server_name varchar(10)  not null , ip varchar(15) not null , port int not null , unique(ip,port) );insert into t1_server values(1,"阿里","192.168.11.251",3306);insert into t1_server values(1,"阿里","192.168.11.251",80);insert into t1_server values(1,"阿里","192.168.11.252",80);insert into t1_server values(1,"阿里","192.168.11.252",80); error# unique : 有可能出现多个空值的情况要注意;create table t2_server(id int , server_name varchar(10)  not null , ip varchar(15) , port int , unique(ip,port) );insert into t2_server values(1,"腾讯","192.168.11.251",3306);insert into t2_server values(1,"腾讯","192.168.11.251",3306); errorinsert into t2_server values(1,"腾讯",null,null); # 注意点: 允许插入多个空值;+------+-------------+----------------+------+| id   | server_name | ip             | port |+------+-------------+----------------+------+|    1 | 腾讯        | 192.168.11.251 | 3306 ||    1 | 腾讯        | NULL           | NULL ||    1 | 腾讯        | NULL           | NULL ||    1 | 腾讯        | NULL           | NULL ||    1 | 腾讯        | NULL           | NULL |+------+-------------+----------------+------+# 2.联合唯一主键create table t3_server(id int ,server_name varchar(10)  not null , ip varchar(15) , port int  , primary key(ip,port) );insert into t3_server values(1,"华为","192.168.11.251",3306);insert into t3_server values(1,"华为","192.168.11.251",3307);"""总结:primary key(字段1,字段2 ... )   联合唯一主键 , 单个字段情况,可以设置一个主键,如果是多个字段只能设置成联合主键,合在一起表达一个主键概念;unique(字段1,字段2 ... )    联合唯一索引index(字段1,字段2 ... )    联合普通索引"""# 3.foreign key:    外键,把多张表通过一个关联字段联合在一起 (该字段可以设置成外键,作用是可以联级更新或者联级删除)"""  语法:foreign key(classid) references class1(id)  条件:被关联的字段,必须具备唯一属性;"""student1:id  name          age    classid      1  wangtongpei   58     12   liuyifeng     85     13   wangwen       18     2class1:id classname 1  python322  python33# 创建class1create table class1(id int , classname varchar(255));# 添加唯一索引alter table class1 add unique(id);# 删除索引create table class222(id int unique, classname varchar(255));alter table class1 drop index id;# 创建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,"python32");insert into class1 values(2,"python33");insert into class1 values(3,"python34");insert into student1 values(null,"wangtongpei",58,1);insert into student1 values(null,"liuyifeng",85,1);insert into student1 values(null,"wangwen",18,2);# 没有关联的数据可以直接删除delete from class1 where id = 1;# 有关联的数据不能直接删除,要先把关联的数据删掉之后再删除delete from student1 where id = 3;delete from class1 where id = 2;# 联级更新 , 联级删除 ( 谨慎使用 )"""联级删除 on delete cascade联级更新 on update cascade"""# 创建class2create table class2(id int primary key auto_increment, 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,"python32");insert into class2 values(2,"python33");insert into class2 values(3,"python34");insert into student2 values(null,"wangtongpei",58,1);insert into student2 values(null,"liuyifeng",85,1);insert into student2 values(null,"wangwen",18,2);# 联级删除 (把所有关联数据全部删除,谨慎;)delete from class2 where id = 1;# 联级更新 (把所有关联数据全部更新,谨慎;)update class2 set id = 100 where classname="python33# ### part3
"""
主键索引 : PRI    [primary key]
唯一索引 : UNI    [unique]
普通索引 : MUL    [index]
"""
# 1.联合唯一索引
	"""unique(字段1,字段2,字段3 ..... )  合在一起,该数据不能重复"""
	# unique + not null
	create table t1_server(id int , server_name varchar(10)  not null , ip varchar(15) not null , port int not null , unique(ip,port) );
	insert into t1_server values(1,"阿里","192.168.11.251",3306);
	insert into t1_server values(1,"阿里","192.168.11.251",80);
	insert into t1_server values(1,"阿里","192.168.11.252",80);
	insert into t1_server values(1,"阿里","192.168.11.252",80); error
	# unique : 有可能出现多个空值的情况要注意;
	create table t2_server(id int , server_name varchar(10)  not null , ip varchar(15) , port int , unique(ip,port) );
	insert into t2_server values(1,"腾讯","192.168.11.251",3306);
	insert into t2_server values(1,"腾讯","192.168.11.251",3306); error
	insert into t2_server values(1,"腾讯",null,null); # 注意点: 允许插入多个空值;
	+------+-------------+----------------+------+
	| id   | server_name | ip             | port |
	+------+-------------+----------------+------+
	|    1 | 腾讯        | 192.168.11.251 | 3306 |
	|    1 | 腾讯        | NULL           | NULL |
	|    1 | 腾讯        | NULL           | NULL |
	|    1 | 腾讯        | NULL           | NULL |
	|    1 | 腾讯        | NULL           | NULL |
	+------+-------------+----------------+------+

# 2.联合唯一主键
	create table t3_server(id int ,server_name varchar(10)  not null , ip varchar(15) , port int  , primary key(ip,port) );
	insert into t3_server values(1,"华为","192.168.11.251",3306);
	insert into t3_server values(1,"华为","192.168.11.251",3307);
	"""
	总结:
		primary key(字段1,字段2 ... )   联合唯一主键 , 单个字段情况,可以设置一个主键,如果是多个字段只能设置成联合主键,合在一起表达一个主键概念;
		unique(字段1,字段2 ... )	    联合唯一索引
		index(字段1,字段2 ... )		    联合普通索引
	"""

# 3.foreign key:    外键,把多张表通过一个关联字段联合在一起 (该字段可以设置成外键,作用是可以联级更新或者联级删除)
	"""
		语法:	foreign key(classid) references class1(id)
		条件:	被关联的字段,必须具备唯一属性;
	"""
	student1:
		id  name          age    classid
		1  	wangtongpei   58     1
		2   liuyifeng     85     1
		3   wangwen       18     2
	class1:
		id classname
		1  python32
		2  python33

	# 创建class1
	create table class1(id int , classname varchar(255));
	# 添加唯一索引
	alter table class1 add unique(id);
	# 删除索引
	create table class222(id int unique, classname varchar(255));
	alter table class1 drop index id;
	# 创建student1
	create 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,"python32");
	insert into class1 values(2,"python33");
	insert into class1 values(3,"python34");
	insert into student1 values(null,"wangtongpei",58,1);
	insert into student1 values(null,"liuyifeng",85,1);
	insert into student1 values(null,"wangwen",18,2);
	# 没有关联的数据可以直接删除
	delete from class1 where id = 1;
	# 有关联的数据不能直接删除,要先把关联的数据删掉之后再删除
	delete from student1 where id = 3;
	delete from class1 where id = 2;

	# 联级更新 , 联级删除 ( 谨慎使用 )
	"""
	联级删除 on delete cascade
	联级更新 on update cascade
	"""
	# 创建class2
	create table class2(id int primary key auto_increment, classname varchar(255));
	# 创建student2
	create 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,"python32");
	insert into class2 values(2,"python33");
	insert into class2 values(3,"python34");
	insert into student2 values(null,"wangtongpei",58,1);
	insert into student2 values(null,"liuyifeng",85,1);
	insert into student2 values(null,"wangwen",18,2);
	# 联级删除 (把所有关联数据全部删除,谨慎;)
	delete from class2 where id = 1;
	# 联级更新 (把所有关联数据全部更新,谨慎;)
	update class2 set id = 100 where classname="python33";

3. 存储引擎_表关系

# ### part4 表与表之间的关系
(1) 一对一 : id name age sex address guanlian    id userid mother father ....
(2) 一对多(多对一) : 班级和学生之间的关系 一个班级可以对应多个学生,反过来,多个学生对应一个班级;
(3) 多对多 : 一个学生可以同时学习多个学科,一个学科同时可以被多个学生学习
			 一本书可以被多个作者共同编写,一个作者可以写多本书
xueke (表1)
id  name
1   math
2   english
3   wuli
student (表2)
id  name
1   wangwen
2   wangwei
3   wangtongpei
relation (关系表3)
"""
把 xid 和 sid 这两个关联字段设置成外键,
关联xueke表里的id(对应的xid) ,
关联student表里的id(对应的sid)
"""
xid sid
1   1
1   2
1   3
2   1
2   2
2   3

# ### part5 存储引擎 : 存储数据的一种结构方式
# 概念:
表级锁 :  只要有一个线程执行修改表中的相关操作,就会上锁,其他线程默认等待;
行级锁 :  针对于当前表中的这条记录,这一行进行上锁,其他数据仍然可以被其他线程修改,实现高并发,高可用;
事务处理: 执行sql语句时,必须所有的操作全部成功,才最终提交数据,有一条失败,直接回滚,恢复到先前状态
begin     : 开启事务
commit    : 提交数据
rollback  : 回滚数据

MyISAM: 表级锁    			  (5.5版本之前的默认存储引擎)
InnoDB: 事务处理,行级锁,外键 (5.5版本之后的默认存储引擎)
MEMORY: 把数据放在内存中,临时缓存;
BLACKHOLE: anything you write to it disappears
		   一般用于同步主从数据库;(放在主数据库和从数据库之间的一台服务器;产生binlog日志进行分发,减轻master的压力)
"""
主数据库: 增删改
从数据库: 查询
配置: 一主一从 , 一主多从 , 多主多从
"""
"""
show engins;  # 查看存储引擎
show create table memary1; # 查看创建数据库的结构
desc + 表名;  # 查看表结构
"""
create table myisam1( id int ) engine=MyISAM;
.frm 表结构
.MYD 表数据
.MYI 表索引
create table innodb1( id int ) engine=InnoDB;
.frm 表结构
.ibd 表数据+表索引
create table memory1( id int ) engine=MEMORY;
.frm 只有表结构 , 数据存放在内存中
create table blackhole( id int ) engine=BLACKHOLE;
.frm 只有表结构 , 所有的数据都不会存储;

# ### 额外补充
# 关于约束的添加和删除
# 1 添加/删除 约束 not null
	#alter table 表名 modify 字段名 类型
	alter table t1 modify id int not null
	alter 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 外键 (先通过desc 表 找到外键名字,然后再删)
	alter table student1 drop foreign key student1_ibfk_1; #删除
	alter table student1 add foreign key(classid) references class1(id) #添加

总结

本篇文章就到这里了,希望能够给你带来帮助,也希望您能够多多关注我们的更多内容!

(0)

相关推荐

  • Python全栈之学习CSS(1)

    目录 1. 表单框类型 文件上传: 2. 表单属性 3. css引入 my.css 4. 选择器 4.1 常用选择器 4.2 选择器的优先级 4.3 关系选择器 4.4 属性选择器 4.5 伪类选择器_颜色设置 4.6 伪对象选择器 5. 字体属性设置 cursor属性: 6. 文本属性 7. 盒子模型 order-style: 8. 学习工具 总结 1. 表单框类型 <!DOCTYPE html> <html lang="en"> <head> &

  • Python全栈之学习MySQL(3)

    目录 1. pymysql的基本操作 2. sql注入攻击 3. sql增删改查 4. mysql的数据恢复 5. sql语句优化 总结 1. pymysql的基本操作 # ### python 操作mysql import pymysql # ### 1.基本语法 """ # (1) 创建连接对象 host user password database 这四个参数必写 conn = pymysql.connect( host="127.0.0.1" ,

  • Python全栈之学习JS(1)

    目录 1. js的数据类型 1.1 js引入方式 1.2 注释变量 1.3 数据类型 2. js类型转换_运算符 2.1 强制转换_Number 2.2 强制转换_String 2.3 强制转换_Boolean 2.4 自动类型转换_Number_Boolean_String三者之间转换 2.5 js运算符 3. js流程控制 3.1 分支结构 3.2 分支结构_switch_case 3.3 循环结构 4. js函数 4.1 函数 4.2 函数的调用 总结 1. js的数据类型 1.1 js引

  • Python全栈之学习JQuery

    目录 1. lable标签补充 2. jquery引入和简单使用 3. 选择器 3.1 基础选择器 3.2 组合选择 3.3 层级选择器 3.4 属性选择器 3.5 表单对象属性选择器 3.6 表单选择器 3.7 筛选器方法 4. 文本操作 4.1 选择器优先级和类值操作 4.2 值操作 4.3 创建标签 4.4 文档操作 4.5 删除和清空标签 4.6 字符串占位符 总结 1. lable标签补充 <!DOCTYPE html> <html lang="en">

  • Python全栈之学习JS(3)

    目录 1. dom节点 1.1 dom节点获取 1.2 节点元素层级关系 1.3 修改_清空内容 1.4 隐藏显示密码效果 2. 全选_反选_不选 2.1 全选_反选_不选 2.2 js控制css的相关属性 2.3 js事件 3. 模态框 1. dom节点 1.1 dom节点获取 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <met

  • Python全栈之学习MySQL(2)

    目录 1. mysql_where子句_聚合函数 2. mysql_其他子句语法 3. mysql_子查询 4. exists关键字 5. 练习所需表数据 6. 小练习 (1)表结构: (2)黏贴如下sql,直接建表 (3)练习题目 总结 1. mysql_where子句_聚合函数 # ### part 单表查询 """ select ... from ... where ... group by ... having ... order by ... limit ... &

  • Python全栈之学习HTML

    目录 1. vscode相关配置 2. html认识 2.1 html认识 2.2 html结构 2.3 html语法特征 3. 标签种类_列表 3.1 常见标签 3.2 标签种类 3.3 列表 3.4 超链接标签 3.5 a链接跳锚点 3.6 img图片标签 3.7 table表格标签 3.8 iframe子窗口 4. 音视频_表单 4.1 音视频标签 4.2 form标签 5. 小练习 总结 1. vscode相关配置 w3c school 手册: https://www.w3school.

  • Python全栈之学习MySQL(1)

    目录 1. mysql约束 2. 外键_联合主键_唯一索引 3. 存储引擎_表关系 总结 1. mysql约束 # ### char varchar (补充) char 字符长度 255个 varchar 字符长度 21845个 # ### part1 时间类型 date YYYY-MM-DD 年月日 (节假日,纪念日) time HH:MM:SS 时分秒 (体育竞赛,记录时间) year YYYY 年份 (历史,酒的年份) datetime YYYY-MM-DD HH:MM:SS 年月日 时分

  • Python全栈之学习JS(2)

    目录 1. js对象 1.1 object对象 1.2 json对象 2. js字符串函数 3. js数组相关方法 4. js数学对象相关方法 5. BOM对象 5.1 定时器 5.2 获取年月日时分秒 5.3 Navigator 5.4 历史对象 6. BOM对象location 7. 小提示 ceshi.html: 总结 1. js对象 1.1 object对象 <!DOCTYPE html> <html lang="en"> <head> &l

  • Python全栈之学习CSS(2)

    目录 1. css背景图 1.1 背景属性 1.2 背景图片引入 2. 相对_绝对_固定 2.1 相对定位 2.2 绝对定位 2.3 固定定位 3. float浮动 3.1 display转换元素 3.2 float浮动 4. html里面的bug 4.1 float内容塌陷问题 4.2 margin-top失效问题 4.3 overflow 总结 1. css背景图 1.1 背景属性 <!DOCTYPE html> <html lang="en"> <h

随机推荐