MySQL day03

昨日内容回顾

  • 字符编码与配置文件

    1.\s   # 查看数据库信息
    2.配置文件
    	my-default.ini   my.ini
    3.配置信息
    	 [mysqld]
        [mysql]
        [client]
    
  • 存储引擎

    1.show engines; # 查看所有的存储引擎
    2.常见存储引擎
    	InnoDB:5.5版本之后的存储引擎
    	MyISAM:5.5版本之前的存储引擎
       Memory:基于内存的存储引擎
       BlackHole:黑洞
    3.常见存储引擎底层文件区别   
    
  • 创建表的完整语法

    create table 表名(
    	字段名 字段类型(数字) 约束条件
       字段名 字段类型(数字) 约束条件
       字段名 字段类型(数字) 约束条件
    )
    
  • 字段类型

    整型
    	tinyint
       smallint
    	int 
       bigint
    浮点型
    	float
       double
    	decimal
    字符型
    	char
       varchar
    枚举与集合
    	enum
       set
    日期
    	datetime
       date
    	time
       year
    
  • sql_mode

    set session sql_mode = ''
    set global sql_mode = ''
    配置文件
    
  • 约束条件

    约束条件相当于在字段类型的基础上给字段添加额外的限制
    unsgined
    zerofill
    not null
    default
    unique
    

今日内容详细

约束条件

  • primary key 主键

1.单从约束角度上而言主键等价于非空且唯一 not null unique

	create table t1(
		id int primary key,
		name varchar(32)
	);

2.InnoDB存储引擎规定一张表必须有且只有一个主键

  • 如果创建的表中没有主键也没有非空且唯一的字段 那么InnoDB存储引擎会自动采用一个隐藏的字段作为主键(主键可以加快数据查询:新华字典的目录)
  • 如果创建的表中没有主键但是有非空且唯一的字段 那么InnoDB存储引擎会自动将该字段设置为主键

3.创建表的时候都应该有一个'id'字段 并且该字段应该作为主键

		uid、sid、pid、gid、cid、id
补充说明
    		id int primary key  单列主键
          	sid int,
		nid int,
  		primary key(sid, nid)  联合主键
  • auto_increment自增
    该约束条件不能单独使用 必须跟在键后面(主要配合主键一起使用)
	create table t3(
        id int auto_increment
        );
        上述写法不正确,会以下这个错误
	there can be only one auto column and it must be defined as a key
        正确写法:
	create table t4(
        id int primary key auto_increment,
        name varchar(32)
        );
    
 	补充说明:自增的特点
   		自增的操作不会因为执行删除数据的操作而回退或者重置
        	delete from 
        如果非要重置主键 需要格式化表
    	    truncate 表名;  # 删除表数据并重置主键值

约束条件之外键

1.外键前戏
	需要创建一张员工表
        表中的字段有:
    	id name gender dep_name dep_desc
    
	上述表的缺陷
	   1.表结构不清晰,到底是员工表还是部门表(不严重 无所谓)
   	   2.有些字段反复编写(存取)浪费存储空间(不严重,无所谓)
	   3.表的扩展性极差,牵一发动全身(效率极低非常严重)
        
 	优化操作>>>:拆表
   		id    name    gender
     		id  dep_name  dep_desc
    
    拆表之后解决了三个问题,但是出现了一个致命的缺陷(表与表之间看不出来数据之间的关系了)
    
 解决措施
	在员工表里面加一个部门编号字段,填写部门数据的主键值
    
 外键字段
	专门用于记录表与表之间数据的关系
    
 2.外键字段的创建
	外键字段是用来记录表与表之间数据的关系,而数据的关系有四种
    (1)一对多关系
    (2) 多对多关系
    (3) 一对一关系
    (4)没有关系
    
  2.1表数据关系的判定  >>>:'换位思考'
		针对员工表和部门表
        1.先站在员工表角度
        	问:一条员工数据能否对应多条部门数据
    		 翻译:一名员工能否属于多个部门
          	答:不可以
        2.站在部门标的角度
        	问:一条部门数据能否对应多条员工数据
    		 翻译:一个部门能否拥有多个员工
          	答:可以
        完成换位思考之后得出的答案案  一个可以一个不可以
        那么表关系就是"一对多"
        	部门是一  员工是多
          针对一对多的关系,外键字段建在多的一方
         ps:没有多对一这种说法,只有'一对多'

Foreign key

1.先写普通字段
2.然后在写外键字段
# 员工表
create table emp(
   id int primary key auto_increment,
   name varchar(32),
   gender enum('male','female','others') default 'male',
   dep_id int,
   foreign key(dep_id) references dep(id)
)
# 部门表
create table dep(
   id int primary key auto_increment,
   dep_name varchar(32),
   dep_desc varcahr(32)
);
create table dep(
   id int primary key auto_increment,
   dep_name varchar(32),
   dep_desc varcahr(32)
);
--------------------------------------------------------------------
"""
1.创建表的时候需要先创建被关联的表(没有外键的表),然后再创建关联表(有外键的表)
2.插入表数据的时候,针对外键字段,只能填写被关联表已经出现过的数据值
3.被关联字段无法修改和删除
	有点不太好,操作限制性太强
	
"""
--------------------------------------------------------------------
级联更新 级联删除 

	被关联数据一旦修改,那么关联的数据同步修改
 create table emp1(
   id int primary key auto_increment,
   name varchar(32),
   gender enum('male','female','others') default 'male',
   dep_id int,
   foreign key(dep_id) references dep1(id)
   on update cascade   # 级联更新
   on delete cascade   # 级联删除
 );
create table dep1(
   id int primary key auto_increment,
   dep_name varchar(32),
   dep_desc varchar(32)
);
"""
扩展:
	在实际工作中,很多时候可能并不会使用外键,因为外键增加了表之间的耦合度,不便于单独操作 资源消耗增加
	我们为了能够秒输出表数据的关系,又不想使用外键
		可以自己通过写SQL  建立代码层面的关系

"""

表关系之多对多

以书籍表和作者表为例
	1.先站在书籍表的角度
    	问:一条书籍数据能否对应多条作者数据
       答:可以
   2.再站在作者表的角度
		 问:一条作者数据能佛对应多条书籍数据
       答:可以
--------------------------------------------------------------------
总结:两边都可以,那么表数据关系就是'多对多'
针对多对多表关系,外键字段不能建在任何一方!!!
  create table book(
       id int primary key auto_increment,
       title varchar(32),
       author_id int,
       foreign key(author_id) references author(id)
       on update cascade  # 级联更新
       on delete cascade  # 级联删除
    );

需要单独开设第三张关系表,存储数据关系
create table book(
       id int primary key auto_increment,
       title varchar(32)
    );
   create table author(
       id int primary key auto_increment,
       name varchar(32)
    );
   create table book2author(
       id int primary key auto_increment,
       book_id int,
       foreign key(book_id) references book(id)
       on update cascade  # 级联更新
       on delete cascade,
       author_id int,
       foreign key(author_id) references author(id)
       on update cascade
       on delete caecade
   );

表关系之一对一

以用户表和用户详情表
   1.先站在用户表的角度
       问:一条用户数据能不能对应多条用户详情数据
       答:不可以
   2.再站在用户详情表的角度
      问:一条用户详情数据能不能对应多条用户数据
      答:不可以
        
   总结:两边都不可以,那么先考虑是不是没有关系
    	如果有关系那么肯定就是'一对一'
   针对'一对一'的表关系 外键字段建在任何一张表都可以,但是建议你建在查询频率较高的表中便于后续查询
create table user(
          id int primary key auto_increment,
          name varchar(32)
          detail_id int unique,  # 一对一和一对多的区别就是在这里  unique
          foreign key(detail_id) references userDetail(id)
          on update cascade
          on delete cascade
        );
create tale userdetail(
  id int primary key auto_increment,
  phone bigint
);
            

作业

1.服务器表与应用程序表 >>>: 一对多
一个服务器可以对应多个应用程序
一个应用程序不可以对应多个服务器

2.课程表与班级表 >>>: 多对多
一个班级可以有多门课
一门课也可以多个班上

3.学生表与班级表 >>>: 一对多
一个学生不可以对应很多个班
一个班可以有很多学生

4.老师表与课程表 >>>: 多对多
一个老师可以教多门课
一门课可以多个老师教

5.书籍表与出版社表 >>>: 多对多
一本书籍可以在多个出版社出版
一个出版社可以出版多本书

posted @ 2022-08-16 16:08  W-Y-N  阅读(67)  评论(0)    收藏  举报