mysql表相关

1、存储引擎

日常生活中文件格式有很多中,并且针对不同的文件格式会有对应不同存储方式和处理机制(txt,pdf,word,mp4…)

针对不同的数据应该有对应的不同的处理机制来存储

存储引擎就是不同的处理机制

MySQL主要存储引擎

  • Innodb

    是MySQL5.5版本及之后默认的存储引擎

    存储数据更加的安全

  • myisam

    是MySQL5.5版本之前默认的存储引擎

    速度要比Innodb更快 但是我们更加注重的是数据的安全

  • memory

    内存引擎(数据全部存放在内存中) 断电数据丢失

  • blackhole

    无论存什么,都立刻消失(黑洞)

"""
# 查看所有的存储引擎
show engines;

# 不同的存储引擎在存储表的时候 异同点
create table t1(id int) engine=innodb;
create table t2(id int) engine=myisam;
create table t3(id int) engine=blackhole;
create table t4(id int) engine=memory;

# 存数据
insert into t1 values(1);
insert into t2 values(1);
insert into t3 values(1);
insert into t4 values(1);
"""

在这里插入图片描述
不同引擎创建的文件

在这里插入图片描述

2、创建表的完整语法

# 语法
create table 表名(
	字段名1 类型(宽度) 约束条件,
    字段名2 类型(宽度) 约束条件,
    字段名3 类型(宽度) 约束条件
)

# 注意
1 在同一张表中字段名不能重复
2 宽度和约束条件是可选的(可写可不写) 而字段名和字段类型是必须的
	约束条件写的话 也支持写多个
    字段名1 类型(宽度) 约束条件1 约束条件2...,
	create table t5(id);  #报错 没有写id数据类型
3 最后一行不能有逗号
	create table t6(
        id int,
        name char,
    );   					#报错

"""补充"""
# 宽度
	一般情况下指的是对存储数据的限制
	create table t7(name char);  默认宽度是1
    insert into t7 values('jason');
    insert into t7 values(null);  关键字NULL
    	针对不同的版本会出现不同的效果
        	5.6版本默认没有开启严格模式 规定只能存一个字符。如果给了多个字符,那么mysql会自动帮你截取
            5.7版本及以上或者开启了严格模式 规定只能存几个 就不能超,一旦超出范围立刻报错 Data too long for ....
"""严格模式到底开不开呢?"""
MySQL5.7之后的版本默认都是开启严格模式的
使用数据库的准则:
	能尽量少的让数据库干活就尽量少 不要给数据库增加额外的压力

# 约束条件 null  not null不能插入null
create table t8(id int,name char not null);

"""
宽度和约束条件到底是什么关系
	宽度是用来限制数据的存储
	约束条件是在宽度的基础之上增加的额外的约束
"""
  • 严格模式
# 如何查看严格模式
show variables like "%mode";

模糊匹配/查询
	关键字 like
		%:匹配任意多个字符
        _:匹配任意单个字符

# 修改严格模式
	set session  只在当前窗口有效
    set global   全局有效
    
    set global sql_mode = 'STRICT_TRANS_TABLES';
    
    修改完之后 重新进入服务端即可

3、 基本数据类型

3.1、整型

  • 分类

    TINYINT SMALLINT MEDUIMINT INT BIGINT

  • 作用

    存储年龄、等级、id、号码等等

注意:为该类型指定宽度时,仅仅只是指定查询结果的显示宽度,与存储范围无关,存储范围如下。其实我们完全没必要为整数类型指定显示宽度,使用默认的就可以了
在这里插入图片描述

以TINYINT 
	是否有符号
		默认情况下是带符号的
	超出会如何
		超出限制只存最大可接受值
"""
create table t9(id tinyint);
insert into t9 values(-129),(256);

在这里插入图片描述

# 约束条件之unsigned 无符号
create table t10(id tinyint unsigned);

在这里插入图片描述

"""
create table t11(id int);
# int默认也是带符号的  
# 整型默认情况下都是带有符号的

# 针对整型 括号内的宽度到底是干嘛的
create table t12(id int(8));
insert into t12 values(123456789);

"""
特例:只有整型括号里面的数字不是表示限制位数
id int(8)
	如果数字没有超出8位 那么默认用空格填充至8位
	如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
"""
create table t13(id int(8) unsigned zerofill);
# 用0填充至8位

# 总结:
针对整型字段 括号内无需指定宽度 因为它默认的宽度以及足够显示所有的数据了

3.2、浮点型

  • 分类

    FLOAT、DOUBLE、DECIMAL

  • 作用

    身高、体重、薪资

  # 存储限制
  float(255,30)  # 总共255位 小数部分占30位
  double(255,30)  # 总共255位 小数部分占30位
  decimal(65,30)  # 总共65位 小数部分占30位

  # 精确度验证
  create table t15(id float(255,30));
  create table t16(id double(255,30));
  create table t17(id decimal(65,30));

  insert into t15 values(1.111111111111111111111111111111);
  '''
  mysql> select * from t15;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111164093017600000000000000 |
+----------------------------------+
  '''
  insert into t16 values(1.111111111111111111111111111111);
  '''
  mysql> select * from t16;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111200000000000000 |
+----------------------------------+
  '''
  
  insert into t17 values(1.111111111111111111111111111111);
 '''
 mysql> select * from t17;
+----------------------------------+
| id                               |
+----------------------------------+
| 1.111111111111111111111111111111 |
+----------------------------------+
 '''
  精度:
  	float < double < decimal
  	# 要结合实际应用场景 三者都能使用

3.3、字符类型

  • 分类
  """
  char
  	定长
  	char(4)	 数据超过四个字符直接报错 不够四个字符空格补全
  varchar
  	变长
  	varchar(4)  数据超过四个字符直接报错 不够有几个存几个
  """
  create table t18(name char(4));
  create table t19(name varchar(4));
  
  insert into t18 values('a');
  insert into t19 values('a');
  
  # 介绍一个小方法 char_length统计字段长度
  select char_length(name) from t18;
  select char_length(name) from t19;
  """
  首先可以肯定的是 char硬盘上存的绝对是真正的数据 带有空格的
  但是在显示的时候MySQL会自动将多余的空格剔除
  """
  
  # 再次修改sql_mode 让MySQL不要做自动剔除操作
  set global sql_mode = 'STRICT_TRANS_TABLES,PAD_CHAR_TO_FULL_LENGTH';
char与varchar对比
  """
  char
  	缺点:浪费空间
  	优点:存取都很简单
  		直接按照固定的字符存取数据即可
  		jason egon alex wusir tank 
  		存按照五个字符存 取也直接按照五个字符取
  		
  varchar
  	优点:节省空间
  	缺点:存取较为麻烦
  		1bytes+jason 1bytes+egon 1bytes+alex 1bytes+tank 
  		
  		存的时候需要制作报头
  		取的时候也需要先读取报头 之后才能读取真实数据
  		
  以前基本上都是用的char 其实现在用varchar的也挺多
  """
  
  补充:
      进来公司之后你完全不需要考虑字段类型和字段名
      因为产品经理给你发的邮件上已经全部指明了

3.4、时间类型

  • 分类

    date:年月日 2020-5-4

    datetime:年月日时分秒 2020-5-4 11:11:11

    time:时分秒11:11:11

    Year:2020

  create table student(
  	id int,
      name varchar(16),
      born_year year,
      birth date,
      study_time time,
      reg_time datetime
  );
  insert into student values(1,'egon','1880','1880-11-11','11:11:11','2020-11-11 11:11:11');

3.5、枚举与集合类型

  • 分类
  """
  枚举(enum)  多选一
  集合(set)   多选多
  """
  • 具体使用
  create table user(
  	id int,
      name char(16),
      gender enum('male','female','others')
  );
  insert into user values(1,'jason','male');  正常
  insert into user values(2,'egon','xxxxooo');  报错
  # 枚举字段 后期在存数据的时候只能从枚举里面选择一个存储 
  
  
  create table teacher(
  	id int,
      name char(16),
      gender enum('male','female','others'),
      hobby set('read','DBJ','hecha')
  );
  insert into teacher values(1,'jason','male','read');  正常
  insert into teacher values(2,'egon','female','DBJ,hecha');  正常
  insert into teacher values(3,'tank','others','生蚝'); 报错
  # 集合可以只写一个  但是不能写没有列举的

3.6、约束条件

  • unsigned
    无符号约束条件(只能是正数)
int类型为例
不设定无符号约束条件
#创建一个表
create table t1(id int);
'''
mysql> create table t1(id int);
Query OK, 0 rows affected (0.25 sec)

mysql> desc t1;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | YES  |     | NULL    |       |
+-------+---------+------+-----+---------+-------+
'''
#写入数据
insert into t1 values(-1),(0),(4096);
'''
mysql> insert into t1 values(-1),(0),(4096);
Query OK, 3 rows affected (0.03 sec)
Records: 3  Duplicates: 0  Warnings: 0

mysql> select * from t1;
+------+
| id   |
+------+
|   -1 |
|    0 |
| 4096 |
+------+
3 rows in set (0.00 sec)
'''

设定无符号约束条件

create table t2 (id int unsigned);
'''
mysql> create table t2 (id int unsigned);
Query OK, 0 rows affected (0.21 sec)

mysql> desc t2;
+-------+------------------+------+-----+---------+-------+
| Field | Type             | Null | Key | Default | Extra |
+-------+------------------+------+-----+---------+-------+
| id    | int(10) unsigned | YES  |     | NULL    |       |
+-------+------------------+------+-----+---------+-------+
1 row in set (0.01 sec)

'''
#写入数据
insert into t2 values(-1),(0),(4096);
'''
mysql> select * from t2;
+------+
| id   |
+------+
|    0 |
|    0 |
| 4096 |
+------+
'''
  • zerofill
    用数字0来进行填充
int类型为例
	int8)指的是显示位数为8位
	如果数字没有超出8位 那么默认用空格填充至8位
	如果数字超出了8位 那么有几位就存几位(但是还是要遵守最大范围)
#创建表
create table t3(id int(8) unsigned);
'''
mysql> desc t3;
+-------+-----------------+------+-----+---------+-------+
| Field | Type            | Null | Key | Default | Extra |
+-------+-----------------+------+-----+---------+-------+
| id    | int(8) unsigned | YES  |     | NULL    |       |
+-------+-----------------+------+-----+---------+-------+
'''

#写入数据
insert into t3(1234567890),(1);
'''
mysql> select*from t3;
+------------+
| id         |
+------------+
| 1234567890 |
|          1 |
+------------+
'''
# 创建用0填充的约束条件表
create table t4(id int(8) unsigned zerofill);
'''
mysql> desc t4;
+-------+--------------------------+------+-----+---------+-------+
| Field | Type                     | Null | Key | Default | Extra |
+-------+--------------------------+------+-----+---------+-------+
| id    | int(8) unsigned zerofill | YES  |     | NULL    |       |
+-------+--------------------------+------+-----+---------+-------+
'''
insert into t4(1234567890),(1);

'''
mysql> select * from t4;
+------------+
| id         |
+------------+
| 1234567890 |
|   00000001 |
+------------+
'''
  • not null
    不能为空约束条件(创建数据时该字段必须填写数据)
#创建一个表
create table t5(id int,name varchar(32));
#null项为yes
'''
mysql> desc t5;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(32) | YES  |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
'''
#单独为id写入数据
insert into t5(id) values(1);
'''
mysql> insert into t5(id) values(1);
Query OK, 1 row affected (0.04 sec)

mysql> select * from t5;
+------+------+
| id   | name |
+------+------+
|    1 | NULL |
+------+------+
'''
#创建约束条件not null 表
create table t6(id int,name varchar(32) not null);
#name 的null变为no
'''
mysql> desc t6;
+-------+-------------+------+-----+---------+-------+
| Field | Type        | Null | Key | Default | Extra |
+-------+-------------+------+-----+---------+-------+
| id    | int(11)     | YES  |     | NULL    |       |
| name  | varchar(32) | NO   |     | NULL    |       |
+-------+-------------+------+-----+---------+-------+
'''
#单独为id写入数据
insert into t6(id) values(1);
#默认填入了空格
'''
mysql> select * from t6;
+------+------+
| id   | name |
+------+------+
|    1 |      |
+------+------+
'''

  • default
    设定默认值
#创建带约束条件的表
create table t7(
	id int,
	name char(16),
	gender enum('male','female','others') default 'male'
);
'''
mysql> desc t7;
+--------+--------------------------------+------+-----+---------+-------+
| Field  | Type                           | Null | Key | Default | Extra |
+--------+--------------------------------+------+-----+---------+-------+
| id     | int(11)                        | YES  |     | NULL    |       |
| name   | char(16)                       | YES  |     | NULL    |       |
| gender | enum('male','female','others') | YES  |     | male    |       |
+--------+--------------------------------+------+-----+---------+-------+
'''
#写入数据
insert into t7(id,name,gender) values('1','tank','others');
'''
mysql> select * from t7;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | tank | others |
+------+------+--------+
'''
insert into t7(id,name) values('2','egon');
'''
mysql> select *from t7;
+------+------+--------+
| id   | name | gender |
+------+------+--------+
|    1 | tank | others |
|    2 | egon | male   |
+------+------+--------+
'''
  • unique
    唯一
单列唯一
#id唯一
create table t8(
	id int unique,
	name char(16)
);
insert into t8 values(1,'jason'),(1,'egon');
'''
mysql> insert into t8 values(1,'jason'),(1,'egon');
ERROR 1062 (23000): Duplicate entry '1' for key 'id'
'''
insert into t8 values(1,'jason'),(2,'egon');
'''
mysql> select * from t8;
+------+-------+
| id   | name  |
+------+-------+
|    1 | jason |
|    2 | egon  |
+------+-------+
2 rows in set (0.00 sec)
'''

联合唯一

例如:
	ip和port
	单个都可以重复 但是加载一起必须是唯一的
create table t9(
	id int unique,
	ip char(16),
	port int,
	unique(ip,port)
);
insert into t9 values(1,'127.0.0.1',8080);
insert into t9 values(2,'127.0.0.1',8081);
insert into t9 values(3,'127.0.0.2',8080);
'''
mysql> select * from t9;
+------+-----------+------+
| id   | ip        | port |
+------+-----------+------+
|    1 | 127.0.0.1 | 8080 |
|    2 | 127.0.0.1 | 8081 |
|    3 | 127.0.0.2 | 8080 |
+------+-----------+------+
'''
insert into t9 values(4,'127.0.0.1',8080);  报错
'''
mysql> insert into t9 values(4,'127.0.0.1',8080);
ERROR 1062 (23000): Duplicate entry '127.0.0.1-8080' for key 'ip'
'''
  • primary key
    主键
"""
1.单单从约束效果上来看primary key等价于not null + unique,非空且唯一!!!
"""
create table t10(id int primary key);
'''
mysql> desc t10;
+-------+---------+------+-----+---------+-------+
| Field | Type    | Null | Key | Default | Extra |
+-------+---------+------+-----+---------+-------+
| id    | int(11) | NO   | PRI | NULL    |       |
+-------+---------+------+-----+---------+-------+
'''
insert into t10 values(null);  报错
'''
mysql> insert into t10 values(null);
ERROR 1048 (23000): Column 'id' cannot be null
'''
insert into t10 values(1),(1);  报错
'''
mysql> insert into t10 values(1),(1);
ERROR 1062 (23000): Duplicate entry '1' for key 'PRIMARY'
'''
insert into t10 values(1),(2); 
'''
mysql> select * from t10;
+----+
| id |
+----+
|  1 |
|  2 |
+----+
'''

"""
2.它除了有约束效果之外 它还是Innodb存储引擎组织数据的依据
Innodb存储引擎在创建表的时候必须要有primary key
因为它类似于书的目录 能够帮助提示查询效率并且也是建表的依据
"""
# 1 一张表中有且只有一个主键 如果你没有设置主键 那么会从上往下搜索直到遇到一个非空且唯一的字段将它自动升级为主键
create table t11(
	id int,
    name char(16),
    age int not null unique,
    addr char(32) not null unique
);
'''
mysql> desc t11;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | YES  |     | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
| age   | int(11)  | NO   | PRI | NULL    |       |
| addr  | char(32) | NO   | UNI | NULL    |       |
+-------+----------+------+-----+---------+-------+
'''
# 2 如果表中没有主键也没有其他任何的非空且唯一字段 那么Innodb会采用自己内部提供的一个隐藏字段作为主键,隐藏意味着你无法使用到它 就无法提示查询速度

# 3 一张表中通常都应该有一个主键字段 并且通常将id/uid/sid字段作为主键
# 单个字段主键
create table t12(
    id int primary key,
	name char(16)
);
'''
mysql> desc t12;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| id    | int(11)  | NO   | PRI | NULL    |       |
| name  | char(16) | YES  |     | NULL    |       |
+-------+----------+------+-----+---------+-------+
'''
# 联合主键(多个字段联合起来作为表的主键 本质还是一个主键)
create table t13(
    ip char(16),
    port int,
    primary key(ip,port)
);
'''
mysql> desc t13;
+-------+----------+------+-----+---------+-------+
| Field | Type     | Null | Key | Default | Extra |
+-------+----------+------+-----+---------+-------+
| ip    | char(16) | NO   | PRI |         |       |
| port  | int(11)  | NO   | PRI | 0       |       |
+-------+----------+------+-----+---------+-------+
'''
"""
也意味着 以后我们在创建表的时候id字段一定要加primary key
"""
  • auto_increment
    自增
id特别多的时候 人为的去维护太麻烦
#创建表
create table t14(
	id int primary key auto_increment,
	name char(16)
);

'''
mysql> desc t14;
+-------+----------+------+-----+---------+----------------+
| Field | Type     | Null | Key | Default | Extra          |
+-------+----------+------+-----+---------+----------------+
| id    | int(11)  | NO   | PRI | NULL    | auto_increment |
| name  | char(16) | YES  |     | NULL    |                |
+-------+----------+------+-----+---------+----------------+
'''

insert into t14(name) values('egon','tank','jason');
'''
mysql> select * from t14;
+----+-------+
| id | name  |
+----+-------+
|  1 | egon  |
|  2 | tank  |
|  3 | jason |
+----+-------+
'''
# 注意auto_increment通常都是加在主键上的 不能给普通字段加
create table t15(
	id int primary key auto_increment,
    name char(16),
    cid int auto_increment
);
'''
ERROR 1075 (42000): Incorrect table definition; there can be only one auto column and it must be defined as a key
'''


"""
以后在创建表的id(数据的唯一标识id、uid、sid)字段的时候
id int primary key auto_increment
"""
补充:

delete from t14  删除表中数据后 主键的自增不会停止

insert into t14(name) values('egon');
'''
mysql> select * from t14;
+----+------+
| id | name |
+----+------+
|  4 | egon |
+----+------+
'''

truncate t14  清空表数据并且重置主键
insert into t14(name) values('egon');
'''
mysql> select * from t14;
+----+------+
| id | name |
+----+------+
|  1 | egon |
+----+------+
'''

4、表与表之间建关系

"""
定义一张员工表 表中有很多字段
id name gender dep_name dep_desc
"""
# 1 该表的组织结构不是很清晰(可忽视)
# 2 浪费硬盘空间(可忽视)
# 3 数据的扩展性极差(无法忽视的)

# 如何优化?
"""上述问题就类似于你将所有的代码都写在了一个py文件中"""
将员工表拆分  员工表和部门表

4.1、外键

"""
外键就是用来帮助我们建立表与表之间关系的
foreign key
"""

4.2、表关系

"""
表与表之间最多只有四种关系
	一对多关系
		在MySQL的关系中没有多对一一说
		一对多 多对一 都叫一对多!!!
	多对多关系
	一对一关系
	没有关系
"""
  • 一对多

在这里插入图片描述

员工表与部门表为例
	先站在员工表
		思考一个员工能否对应多个部门(一条员工数据能否对应多条部门数据)
			不能!!!
			(不能直接得出结论 一定要两张表都考虑完全)
	再站在部门表
		思考一个部门能否对应多个员工(一个部门数据能否对应多条员工数据)
			能!!!
	得出结论
		员工表与部门表示单向的一对多
		所以表关系就是一对多
"""
foreign key
	1 一对多表关系   外键字段建在多的一方
    2 在创建表的时候 一定要先建被关联表 
    3 在录入数据的时候 也必须先录入被关联表
# SQL语句建立表关系
create table dep(
		id int primary key auto_increment,
		dep_name char(16),
		dep_desc char(32)
		);
create table emp(
		id int primary  key auto_increment,
		name char(16),
		gender enum('male','female','others') default 'male',
		dep_id int,
		foreign key(dep_id) references dep(id)
);
insert into dep(dep_name,dep_desc) values('sb教学部','教书育人'),('外交部','多人外交'),('nb技术部','技术能力有限部门');
'''
mysql> select * from dep;
+----+-------------+--------------------------+
| id | dep_name    | dep_desc                 |
+----+-------------+--------------------------+
|  1 | sb教学部    | 教书育人                 |
|  2 | 外交部      | 多人外交                 |
|  3 | nb技术部    | 技术能力有限部门         |
+----+-------------+--------------------------+
'''
insert into emp(name,dep_id) values('jason',2),('egon',1),('tank',1),('kevin',3);
'''
mysql> select * from emp;
+----+-------+--------+--------+
| id | name  | gender | dep_id |
+----+-------+--------+--------+
|  1 | jason | male   |      2 |
|  2 | egon  | male   |      1 |
|  3 | tank  | male   |      1 |
|  4 | kevin | male   |      3 |
+----+-------+--------+--------+
'''

# 修改dep表里面的id字段
update dep set id=200 where id=2;  不行
'''
mysql> update dep set id = 200 where id=2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`day46`.`emp`, CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))
'''
# 删除dep表里面的数据
delete from dep;  不行
'''
mysql> update dep set id = 200 where id=2;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint fails (`day46`.`emp`, CONSTRAINT `emp_ibfk_1` FOREIGN KEY (`dep_id`) REFERENCES `dep` (`id`))
'''

# 1 先删除教学部对应的员工数据 之后再删除部门
	操作太过繁琐
    
# 2 真正做到数据之间有关系
	更新就同步更新
    删除就同步删除

级联更新   >>>   同步更新
级联删除   >>>   同步删除

create table dep(
	id int primary key auto_increment,
    dep_name char(16),
    dep_desc char(32)
);
create table emp(
	id int primary key auto_increment,
    name char(16),
    gender enum('male','female','others') default 'male',
    dep_id int,
    foreign key(dep_ip) references dep(id)
    on update cascade
    on delate cascade
    );
insert into dep(dep_name,dep_desc) values('sb教学部','教书育人'),('外交部','多人外交'),('nb技术部','技术能力有限部门');
insert into emp(name,dep_id) values('jason',2),('egon',1),('tank',1),('kevin',3);
  • 多对多

在这里插入图片描述

"""
图书表和作者表
"""
create table book(
	id int primary key auto_increment,
    title varchar(32),
    price int,
    author_id int,
    foreign key(author_id) references author(id) 
    on update cascade  # 同步更新
    on delete cascade  # 同步删除
);
create table author(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    book_id int,
    foreign key(book_id) references book(id) 
    on update cascade  # 同步更新
    on delete cascade  # 同步删除
);
"""
按照上述的方式创建 一个都别想成功!!!
其实我们只是想记录书籍和作者的关系
针对多对多字段表关系 不能在两张原有的表中创建外键
需要你单独再开设一张 专门用来存储两张表数据之间的关系
"""
create table book(
	id int primary key auto_increment,
    title varchar(32),
    price int
);
create table author(
	id int primary key auto_increment,
    name varchar(32),
    age int
);
create table book2author(
	id int primary key auto_increment,
    author_id int,
    book_id int,
    foreign key(author_id) references author(id) 
    on update cascade  # 同步更新
    on delete cascade,  # 同步删除
    foreign key(book_id) references book(id) 
    on update cascade  # 同步更新
    on delete cascade  # 同步删除
);
  • 一对一
"""
id name age addr phone hobby email........
如果一个表的字段特别多 每次查询又不是所有的字段都能用得到
将表一分为二  
	用户表
		用户表
			id name age
		用户详情表
			id addr phone hobby email........
	
	站在用户表
		一个用户能否对应多个用户详情   不能!!!
	站在详情表
		一个详情能否属于多个用户      不能!!!
	结论:单向的一对多都不成立 那么这个时候两者之间的表关系
		就是一对一
		或者没有关系(好判断)

客户表和学生表
	在你们报名之前你们是客户端
	报名之后是学生(期间有一些客户不会报名)
"""

一对一 外键字段建在任意一方都可以 但是推荐你建在查询频率比较高的表中
create table authordetail(
	id int primary key auto_increment,
    phone int,
    addr varchar(64)
);
create table author(
	id int primary key auto_increment,
    name varchar(32),
    age int,
    authordetail_id int unique,
    foreign key(authordetail_id) references authordetail(id) 
    on update cascade  # 同步更新
    on delete cascade  # 同步删除
)
  • 总结

表关系的建立需要用到foreign key
	一对多
		外键字段建在多的一方
	多对多
		自己开设第三张存储
	一对一
		建在任意一方都可以 但是推荐你建在查询频率较高的表中

判断表之间关系的方式
	换位思考!!!
		员工与部门
	
		图书与作者
	
		作者与作者详情

5、修改表(了解)

# MySQL对大小写是不敏感的
"""
1 修改表名
	alter table 表名 rename 新表名;

2 增加字段
	alter table 表名 add 字段名 字段类型(宽度)  约束条件;
	alter table 表名 add 字段名 字段类型(宽度)  约束条件 first;
	alter table 表名 add 字段名 字段类型(宽度)  约束条件 after 字段名;

3 删除字段
	alter table 表名 drop 字段名;

4 修改字段
	alter table 表名 modify 字段名 字段类型(宽度) 约束条件;
	
	alter table 表名 change 旧字段名 新字段名 字段类型(宽度) 约束条件;
	
"""

6、复制表(了解)

"""
我们sql语句查询的结果其实也是一张虚拟表
"""
create table 表名 select * from 旧表;  不能复制主键 外键 ...

create table new_dep2 select * from dep where id>3; #复制id>3的表结构与内容
  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值