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. dhcpd 启动失败No subnet declaration for wlan0

    今天在调试机器的WIFI热点,好不容易把dhcp编译打包进去,服务启动出现报错No subnet declaration for wlan0,详细信息如下: Internet Systems Cons ...

  2. 字符串压缩 牛客网 程序员面试金典 C++ Python

    字符串压缩 牛客网 程序员面试金典 C++ Python 题目描述 利用字符重复出现的次数,编写一个方法,实现基本的字符串压缩功能.比如,字符串"aabcccccaaa"经压缩会变 ...

  3. hdu 5108 Alexandra and Prime Numbers(水题 / 数论)

    题意: 给一个正整数N,找最小的M,使得N可以整除M,且N/M是质数. 数据范围: There are multiple test cases (no more than 1,000). Each c ...

  4. float32 和 float64

    float32 和 float64 Go语言中提供了两种精度的浮点数 float32 和 float64. float32,也即我们常说的单精度,存储占用4个字节,也即4*8=32位,其中1位用来符号 ...

  5. 设计模式学习-使用go实现建造者模式

    建造者模式 定义 适用范围 与工厂模式的区别 优点 缺点 参考 建造者模式 定义 Builder 模式,中文翻译为建造者模式或者构建者模式,也有人叫它生成器模式. 建造者模式(Builder Patt ...

  6. R语言中文分词包jiebaR

    R语言中文分词包jiebaR R的极客理想系列文章,涵盖了R的思想,使用,工具,创新等的一系列要点,以我个人的学习和体验去诠释R的强大. R语言作为统计学一门语言,一直在小众领域闪耀着光芒.直到大数据 ...

  7. go微服务框架Kratos笔记(一)入门教程

    kratos简介 Kratos 一套轻量级 Go 微服务框架,包含大量微服务相关功能及工具 本文基于kratos v2.0.3,windows平台,其他系统平台均可借鉴参考 环境搭建 Golang开发 ...

  8. Numpy (嵩老师.)

    import numpy as np Numpy 一元函数 对ndarray中的数据执行元素级运算的函数 np.abs(x) np.fabs(x) 计算数组各元素的绝对值 np.sqrt(x) 计算数 ...

  9. 如何提高C# StringBuilder的性能

    本文探讨使用C# StringBuilder 的最佳实践,用于减少内存分配,提高字符串操作的性能. 在 .NET 中,字符串是不可变的类型.每当你在 .NET 中修改一个字符串对象时,就会在内存中创建 ...

  10. [nfls338]基本字典子串

    1.前置知识 以下数字未特殊说明,取值范围均与$N$​​​取交 以下字符串未特殊说明,下标均从1开始,且均为非空串,复杂度中的$n$​​​指字符串长度 周期和border 对于非空集合$S$,定义$\ ...