day03 MySQL数据库之主键与外键

昨日内容回顾

针对库的基本SQL语句

# 增
create database meng; # 查
show databases;
shwo create database meng; # 改
alter database meng charset='gbk'; # 删
drop database meng;

针对表的基本SQL语句

# 增
create table m1(id int,name char(4)); # 查
show tables;
show create table m1;
desc m1; # 改
alter table m1 rename m2; # 删
drop table m1; # 查询所在的库
select database(); # 切换库
use meng;

针对记录的基本SQL语句

# 增
insert into m1 values(1,'db'); # 查
select * from m1;
seletc name from m1; # 改
update m1 set name='mqq' where id=1; # 删
delete from m1 where id=1;
delete from m1;

存储引擎

# 查看引擎
show engines; # 一共有四个
myisam:最早版本,存取速度快,但安全不足。
innodb:存取速度比myisamman,但安全。
memory:存储在内存,断电数据会消失。
blackhole:黑洞,放到这里数据会消失 # 不同之处
myisam:有三个文件
innodb: 有两个文件
memory:有一个文件
blackhole:有一个文件 # 验证不同
create table m1(id int) engine=myisam;

创建表的完整语法

create table 表名 (
字段名称1 字段类型(数字) 约束条件,
字段名称2 字段类型(数字) 约束条件,
字段名称3 字段类型(数字) 约束条件
);

MySQL基本数据类型

# 整形
tinyint
smallint
int
bight # 浮点型
float
double
decimal # 字符类型
char:定长
varchar:变长 # 数字的各自含义
1、数字在数字类型中不是用来限制存储长度的,而是用来控制显示长度
2、数字在其他类型中年都是用来显示存储长度的

sql_mode

# 模糊查询
show variables like '%mode%'; char_length():查询字段长度
set session
set global 'strict_trans_tables':开启严格模式
'pad_char_to_full_length':取消底层优化

今日内容

1、基本数据类型之日期相关类型
2、基本数据类型之枚举与集合
3、约束条件
unsigned
zerofill
not null
default
unique
primary key
auto_increment
外键 # 重要

基本数据类型之日期相关类型

date		:年月日
datetime :年月日时分秒
time :时分秒
year :年 案例:
create table user(
id int comment '编号',
name varchar(255) comment '姓名',
reg_time datetime comment '注册时间',
birthday date comment '生日',
study_time time comment '学习时间',
born_year year comment '年份'
);
"""
字段也可以加类似于注释的说明
comment
"""
# 此处先人工智能模拟
insert into user values(1,'meng','2000-11-11 11:11:11','2000-11-11','11:11:11','2000'); # 然后查询
select * from user;

基本数据类型之枚举与集合

# 枚举
1、多选一:提前定义好数据之后,后续录入只能录入定义好的内容之一。# 录入没有录入的内容,会报错。 案例:
create table m1 (
id int,
name char(6),
gender enum('male','female')
);
insert into m1 values(1,'meng','male') # 可以插入
insert into m1 values(2,'mqq','bai') # 错误,只能选录入的选项 # 集合
多选多(包含多选一) 案例:
create table m2 (
id int,
name char(6),
hobbies set('lookbook','basketball','football')
);
insert into m2 values(1,'meng','lookbook') # 可以选单个
insert into m2 values(1,'meng','lookbook,football'); # 可以选多个,但不能选没有录入的爱好

插入方式

create table m3(id int,name varchar(16));
insert into m3(name) values('meng') # 也可以用这种方式插入数据 """
在插入数据的时候还可以指定表字段
insert into m3(name) values('meng')
"""

约束条件

约束条件:约束条件相当于是在字段类型上添加的额外条件

1、unsigned:无符号
id int unsigned 2、zerofill:0填充
id int zerofill 3、not null:非空(不能为空)
# 插入数据可以指定表字段
create table m3(id int,name varchar(16));
insert into m3(name) values('meng') # 也可以用这种方式插入数据
select * from m3;
id name
NULL meng # 必须填约束
create table m4(id int,name char(6) no null);
insert into m4(id) values(1); # 会报错,不能为空
insert into m4 values(1,''); # 可以这样填,空也是字符 4、default:默认值(用户给了就用用户的,没给用默认的)
create table m5(id int,name char(6) default '无敌');
insert into m5(id) values(1); # 没有写,默认是无敌
insert into m5(id,name) values(2,'meng'); # 写了,就是写的内容
select * from m5;
id name
1 无敌
2 meng 5、unique:唯一(保证字段在整个表里没有重复的数据)
# 单列唯一:指定字段数据不能重复
create table m6(id int,name char(6) unique);
insert into m6 values(1,'meng'),(2,'meng') # 重复数据会报错
insert into m6 values(1,'meng'),(2,'bai') # 成功 # 联合唯一:多个字段数据一致为重复数据
create table server (
id int,
host char(32),
port char(32),
unique(host,port) # 两个数据一致会报错
); insert into server values(1,'127.0.0.1','3333'),(2,'127.0.0.1','3335'),(3,'127.0.0.2','3335'); # 可以加入,必须是ip端口同时一致,才算是重复
insert into server values(1,'127.0.0.1','3333'),(2,'127.0.0.1','3335'),(3,'127.0.0.2','3333'); # 报错,ip和字段一致为重复数据 6、primary key:主键
(1)从约束条件上而言主键相当于no null + unique(非空且唯一)
(2)主键的功能目前简单的理解为能够加快数据的查询速度相当于书的目录
2.1、表中没有任何的主键和其他约束条件
InnoDB默认会采用一个隐藏字段作为表的主键
2.2、表中没有主键但是有非空且唯一的字段
InnoDB会自动将该字段升级为主键
(3)InnoDB存储引擎规定每张表都必须有且只有一个主键
# 结论:每张表都必须要有一个id或者编号之类字段并且该字段就是主键 # 单列主键
验证:非空且唯一
create table m7 (
id int primary key,
name char(6)
);
insert into m7(name) values('meng'); # 报错,不能为空
insert into m7(id,name) values(1,'meng') # 可以插入 验证:自动升级为主键
create table m8 (
id int,
name char(6),
age int not null unique, # 达成非空和唯一的条件自动升级为主键
top int not null unique
);
desc m8;
age | int(11) | NO | PRI | NULL # PRT:主键 # 多列主键(联合主键)
create table m9 (
id int,
age int,
name char(6),
primary key(id,age) # 联合出是为一个主键
); 7、auto_increment:自增(配置主键一起使用,让主键能够自增)
create table m10 (
id int primary key auto_increment,
name char(6)
);
insert into m10(name) values('meng'),('zhang'),('bai'); # 不用加主键,自动生成

主键自增特性

主键的自动是不会收到delete from删除操作的影响
truncate 既可以清空表数据也会重置主键值 验证:删除是否会影响自增
delete from m10 where id=3;
select * from m10;
| id | name
| 1 | meng # 删除不会影响
| 3 | bai 验证:
truncate m10; # 会清空表数据,id重新开始 不建议用

外键

# 前戏
1.定义一张员工表
id name age dep_name dep_desc
1 jason 18 外交部 搞外交
2 kevin 28 教学部 教书育人
3 tony 38 教学部 教书育人
4 oscar 48 安保部 保家卫国
5 jackson 58 财务部 发工资
"""
上述表不合理之处
1.表内部数据混乱(可忽略)
2.反复的录入重复数据(可忽略)
3.修改数据太过繁琐 浪费磁盘空间(可忽略)
4.极大地影响了操作数据的效率
"""
2.将上述表拆分成两张表
id name age
1 jason 18
2 kevin 28
3 tony 38
4 oscar 48
5 jackson 58
id dep_name dep_desc
1 外交部 搞外交
2 教学部 教书育人
3 安保部 保家卫国
4 财务部 发工资
"""拆分完之后解决了上述四个缺陷""" # 外键
用来记录表与表之间的关系

如何查找表关系

1.多对一
2.多对多
3.一对一
4.没有关系 """查找表关系:换位思考"""
书籍表与出版社表
1.先站在书籍表
问:一本书能够对应多个出版社
答:不可以
2.再站在出版社表
问:一个出版社能否对应多本书
答:可以
结论:一个可以一个不可以 表关系为"多对一"
那么外键字段建在"多"的一方
# 针对具有表关系的SQL建议先写普通字段 最后再考虑外键字段
create table book(
id int primary key auto_increment,
title varchar(32),
price int,
pub_id int,
foreign key(pub_id) references publish(id) # book表中的pud_id和publish中的id是关联的
); create table publish(
id int primary key auto_increment,
name varchar(32)
); insert into publish(name) values('东方出版社'),('西方出版社'); # 先插入没有外键的表
insert into book(title,price,pud_id) values('狼道',20,2);
insert into book(title,price,pud_id) values('老人与海',30,1); # pud_id关联着publish表的id
select * from book;
+----+--------------------------+-------+--------+
| id | title | price | pud_id |
+----+--------------------------+-------+--------+
| 1 | 狼道 | 20 | 2 |
| 2 | 老人与海 | 30 | 1 |
+----+--------------------------+-------+--------+

外键约束

1.在创建表的时候需要先创建被关联表(没有外键的表)
2.在写入数据的时候也需要先写入被关联表(没有外键的表)
3.被关联表里面的数据无法直接删除和修改关联字段的操作 # 实时更新,删除
on update cascade
on delete cascade # 级联更新 级联删除
create table emp(
id int primary key auto_increment,
name varchar(32),
age int,
dep_id int,
foreign key(dep_id) references dep(id)
on update cascade
on delete cascade
); create table dep(
id int primary key auto_increment,
name varchar(32)
);
insert into dep(name) values('销售部'),('行政部'),('财政部');
insert into emp(name,age,dep_id) values('meng',18,3),('bai',19,2);
# 修改
update dep set id=200 where id=2; # 实时修改

多对多

以书籍表与作者表为例
1.先站在书籍表的基础之上
问:一本书能否对应多个作者
答:可以
2.在站在作者表的基础之上
问:一个作者能否对应多本书
答:可以
结论:两个都可以那么表关系就是"多对多"
外键字段建在第三张关系表中 # 先写普通字段之后在考虑外键字段
'''错误的创建方式'''
create table book1(
id int primary key auto_increment,
title varchar(32),
author_id int,
foreign key(author_id) references author1(id)
on update cascade
on delete cascade
);
create table author1(
id int primary key auto_increment,
name varchar(32),
book_id int,
foreign key(book_id) references book1(id)
on update cascade
on delete cascade
);
'''正确的创建方式'''
create table book1(
id int primary key auto_increment,
title varchar(32)
);
create table author1(
id int primary key auto_increment,
name varchar(32)
);
create table book2author(
id int primary key auto_increment,
author_id int,
foreign key(author_id) references author1(id)
on update cascade
on delete cascade,
book_id int,
foreign key(book_id) references book1(id)
on update cascade
on delete cascade
);

day03 MySQL数据库之主键与外键的更多相关文章

  1. MySQL数据库删除数据(有外键约束)

    在MySQL中删除一张表或一条数据的时候,出现有外键约束的问题,于是就去查了下方法: SELECT @@FOREIGN_KEY_CHECKS; 查询当前外键约束是否打开 ; 设置为1的时候外键约束是打 ...

  2. 两种获取MySql数据库中所有表的主键和外键约束信息的Sql语句

    最近在写Rafy底层的一些东西,在数据库方面把MySql数据库集成到里面去,里面有一个需求,需要获取非系统数据库,也就是我们自己建立的数据库中所有表的主键和外键元数据列表. 第一种方法:是网上的方法, ...

  3. MySQL的几个概念:主键,外键,索引,唯一索引

    概念: 主键(primary key) 能够唯一标识表中某一行的属性或属性组.一个表只能有一个主键,但可以有多个候选索引.主键常常与外键构成参照完整性约束,防止出现数据不一致.主键可以保证记录的唯一和 ...

  4. mysql主键,外键,索引

    主键 唯一而非空,只能有一个 作用: 1.唯一的标识一行  2.作为一个可以被外键有效引用的对象  3.保证数据完整性 设计原则: 1. 主键应当是对用户没有意义的.如果用户看到了一个表示多对多关系的 ...

  5. MySQL—概念,用户的创建,主键,外键,数据类型,表格创建

    MySQL DBMS,MySQL的概念,数据库分类,以前MySQL的部署中的一些概念 #DBMS:数据库管理系统,用于管理数据库的大型软件.mysql就是dbms的一种 #Mysql:是用于管理文件的 ...

  6. MySQL中的主键,外键有什么作用详解

    MySQL中的主键,外键有什么作用详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 学关系型数据库的同学,尤其在学习主键和外键时会产生一定的困惑.那么今天我们就把这个困惑连根拔起 ...

  7. MySql必知必会实战练习(四)主键、外键、sql约束、联结表

    本博将对主键.外键.MySql数据库约束和联结表的相关特性进行总结和实战 1. 主键 表中的每一行都应该具有可以唯一标识自己的一列(或一组列),而这个承担标识作用的列称为主键 如果没有主键,数据的管理 ...

  8. SQL学习:主键,外键,主键表,外键表,数据库的表与表之间的关系;

    在数据库的学习中,对于一个表的主键和外键的认识是非常重要的. 主键:在一个表中,能唯一的表示一个事物(或者一条记录)的字段,我们称之为主键 注意: 主键的设置可以不只是用一个字段,也可以用若干个字段的 ...

  9. MySQL中的完整性约束条件(主键、外键、唯一、非空)

    数据库的完整性约束用来防止对数据的意外破坏,来保证数据的安全性和一致性. 主键 1.创建表时候指定主键 创建表user(id, username, age),并且id字段非空自增. CREATE TA ...

随机推荐

  1. 助你上手Vue3全家桶之Vue3教程

    目录 前言 1,setup 1.1,返回值 1.2,注意点 1.3,语法 1.4,setup的参数 2,ref 创建响应式数据 3,reactive 创建响应式数据 4,computed 计算属性 5 ...

  2. Typora使用教程

    Typora简介 Typorn 是一款轻便简洁的Markdown编辑器,支持及时渲染技术,这也是与其他Markdown编辑器最显著的区别.及时渲染使得你写Markdown就像是写Word文档一样流畅自 ...

  3. MySql各种文件及参数

    MySql各种文件及参数 参数文件 MySql实例启动时,数据库会去读一个配置参数文件,用来寻找数据库的各种文件所在位置以及指定某些初始化参数,这些参数通常定义了内存结构有多大等信息. 数据库的参数可 ...

  4. 记一次 Java 导出大批量 Excel 优化

    常用的excel导出方案,详情见Spring Boot 入门(十二):报表导出,对比poi.jxl和esayExcel的效率,其中jxl.esayEscel 底层都是基于 poi,它们仅仅是对 poi ...

  5. idea Mark Directory as 的几种文件类型

    1. Source roots (or source folders) 源文件夹 通过为该类别分配文件夹,可以告诉IntelliJ IDEA该文件夹及其子文件夹包含应在构建过程中进行编译的源代码. 2 ...

  6. PTA 6-1 求采用邻接矩阵作为存储结构的无向图各顶点的度 (6分)

    PTA 6-1 求采用邻接矩阵作为存储结构的无向图各顶点的度 (6分) 函数接口定义: 函数接口为: void dgree(MGraph G); G为采用邻接矩阵作为存储结构的有向图 裁判测试程序样例 ...

  7. nose在python2与python3中的包的自动发现用例的区别

    最近在使用python3,同样装了nose,发现自动发现用例总是有问题,如下面的代码结婚 testcase |------ __init__.py |------ test_bb.py test_bb ...

  8. 痞子衡嵌入式:实测i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率

    大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家介绍的是i.MXRT1010上的普通GPIO与高速GPIO极限翻转频率. 上一篇文章 <聊聊i.MXRT1xxx上的普通GPIO与高速GP ...

  9. Mysql - 整数类型的存储字节数和范围

    MySQL 整数类型的存储字节数和范围 type 存储字节数 有符号最小值 无符号最小值 有符号最大值 无符号最大值 TINYINT 1 -128 0 127 255 SMALLINT 2 -3276 ...

  10. 【JAVA】编程(3)---王狗蛋先生去取钱,发现余额不足 !?!?

    作业要求: 1.写一个名为Account的类模拟账户.该类的属性和方法如下所示: 该类包括的属性: ID,余额balance,年利率; 包含的方法:各属性的set和get方法.取款方法withdraw ...