"""
 1、字段的修改、添加、删除
 2、多表关系(外键)
 3、单表详细操作:增删改,查(各种条件)
 """ 字段操作
 create table tf1(
  id int primary key auto_increment,
    x int,
    y int
 );
 ​
 # 修改
 alter table tf1 modify x char(4) default '';
 alter table tf1 change y m char(4) default '';
 ​
 # 增加
 mysql>: alter table 表名 add 字段名 类型[(长度) 约束];  # 末尾
 eg>: alter table tf1 add z int unsigned;
 ​
 mysql>: alter table 表名 add 字段名 类型[(宽度) 约束] first;  # 首位
 eg>: alter table tf1 add a int unsigned first;
 ​
 mysql>: alter table 表名 add 字段名 类型[(宽度) 约束] after 旧字段名;  # 某字段后
 eg>: alter table tf1 add xx int unsigned after x;
 ​
 mysql>: alter table 表名 drop 字段名;  # 删除字段
 eg>: alter table tf1 drop a; 

多表关系

 """
 一对一:丈夫-妻子,用户-身份证,作者-作者详情
 一对多:部门-员工,班级-学生,书-出版社
 多对多:老师-班级,课程-学生,出版社-作者
 """
 ​
 # 书 - 出版社 - 作者 - 作者详情 外键分布
 # 外键是 建立表与表关联 的字段,通常 一个表的外键 是 另一个表的主键(唯一键也可以)
 ​
 # 一对一:外键在任何一方都可以,此时外键要设置 唯一键
 """
 作者(author):id,name,sex,age,mobile
 作者详情(author_detail): id,info,address,author_id
 ----------------------------------------------------
 作者(author):id,name,sex,age,mobile, detail_id
 1 Tom 1
 2 Bom 2
 3 Bob 3
 ​
 作者详情(author_detail): id,info,address
 1 Tom_info
 2 Bom_info
 """
 ​
 # 一对多:外键必须放在多的一方,此时外键值不唯一
 """
 书(book):id,name,price,publish_id
 1 西游记 1
 2 东游记 2
 3 西厢记 1
 4 流浪记 1
 ​
 出版社(publish): id,name,address,phone
 1 老奶奶出版社
 2 小奶奶出版社
 """
 ​
 # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一
 """
 作者(author):id, name, age
 出版社(publish):id, name, address
 作者与出版社关系表:id, author_id, publish_id
 id author_id publish_id
 1 1 1
 2 1 2
 3 2 1
 4 2 2
 """

外键

 # 作者(author):id,name,sex,age,mobile, detail_id
 # 作者详情(author_detail): id,info,address
 ​
 # 1、外键的 字段名 可以自定义(名字随意),通常命名规范(关联表_关联字段)
 ​
 # 2、外键要通过 foreign key 语法建立表与表之间的关联
 ​
 # 3、foreign key(所在表的外键字段) references 关联表(关联字段)
 # eg:foreign key(detail_id) references author_detail(id)
 ​
 # 4、级联关系
 # 级联更新 on update cascade
 # 级联删除 on delete cascade
 ​
 # 重点:外键字段本身可以唯一或不唯一,但是外键关联的字段一定唯一

一对一:无级联关系

 # 作者详情(author_detail): id,info,address
 create table author_detail(
  id int primary key auto_increment,
    info varchar(256),
    address varchar(256)
 );
 ​
 # 作者表id,name,sex,age,mobile, detail_id
 create table author(
  id int primary key auto_increment,
    name varchar(64) not null,
    mobile char(11) unique not null,
    sex enum('男', '女') default '男',
    age int default 0,
    detail_id int unique not null,
     foreign key(detail_id) references author_detail(id)
 );
 ​
 # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
 mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
 mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
 mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
 mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
 ​
 # 修改关联表 author
 mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
 mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
 # 删除关联表 author
 mysql>: delete from author where detail_id=3;  # 直接删除
 ​
 # 修改被关联表 author_detail
 mysql>: update author_detail set id=10 where id=1;  # 无法修改
 # 删除被关联表 author_detail
 mysql>: delete from author_detail where id=1;  # 无法删除
 ​
 # 没有级联关系下:
 # 增加:先增加被关联表记录,再增加关联表记录
 # 删除:先删除关联表记录,再删除被关联表记录
 # 更新:关联与被关联表都无法完成 关联的外键和主键 数据更新 - (如果被关联表记录没有被绑定,可以修改)

一对一:有级联关系

 mysql>: drop table author;
 mysql>: drop table author_detail;
 ​
 ​
 # 作者详情(author_detail): id,info,address
 create table author_detail(
  id int primary key auto_increment,
    info varchar(256),
    address varchar(256)
 );
 ​
 # 作者表id,name,sex,age,mobile, detail_id
 create table author(
  id int primary key auto_increment,
    name varchar(64) not null,
    mobile char(11) unique not null,
    sex enum('男', '女') default '男',
    age int default 0,
    detail_id int unique not null,
     foreign key(detail_id) references author_detail(id)
     on update cascade
     on delete cascade
 );
 ​
 ​
 ​
 # 必须先创建被关联表数据,有关联表外键关联的记录后,关联表才可以创建数据
 mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);  # 错误
 mysql>: insert into author_detail(info,address) values('Tom_info','Tom_address');
 mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 1);
 mysql>: insert into author_detail(info,address) values('Bob_info','Bob_address');
 mysql>: insert into author(name,mobile,detail_id) values('Bob','15666882233', 2);
 ​
 # 修改关联表 author
 mysql>: update author set detail_id=3 where detail_id=2;  # 失败,3详情不存在
 mysql>: update author set detail_id=1 where detail_id=2;  # 失败,1详情已被关联
 mysql>: insert into author_detail(info,address) values('Tom_info_sup','Tom_address_sup');
 mysql>: update author set detail_id=3 where detail_id=2; # 有未被其他数据关联的数据,就可以修改
 # 删除关联表 author
 mysql>: delete from author where detail_id=3;  # 直接删除
 ​
 # 修改被关联表 author_detail
 mysql>: update author_detail set id=10 where id=1;  # 级联修改,同步关系关联表外键
 ​
 # 删除被关联表 author_detail
 mysql>: delete from author where detail_id=10;  # 可以删除对被关联表无影响
 mysql>: insert into author(name,mobile,detail_id) values('Tom','13344556677', 10);
 mysql>: delete from author_detail where id=10;  # 可以删除,将关联表的记录级联删除掉

一对多

 # 一对多:外键必须放在多的一方,此时外键值不唯一
 ​
 # 出版社(publish): id,name,address,phone
 create table publish(
  id int primary key auto_increment,
    name varchar(64),
    address varchar(256),
    phone char(20)
 );
 ​
 # 书(book):id,name,price,publish_id, author_id
 create table book(
  id int primary key auto_increment,
    name varchar(64) not null,
    price decimal(5, 2) default 0,
    publish_id int,  # 一对多的外键不能设置唯一
     foreign key(publish_id) references publish(id)
     on update cascade
     on delete cascade
 );
 ​
 # 增:先增加被关联表(publish)的数据,再增加关联表(book)的数据
 mysql>: insert into publish(name, address, phone) values
 ('人民出版社', '北京', '010-110'),
 ('西交大出版社', '西安', '010-119'),
 ('老男孩出版社', '上海', '010-120');
 ​
 mysql>: insert into book(name, price, publish_id) values
 ('西游记', 6.66, 1),
 ('东游记', 8.66, 1),
 ('python从入门到入土', 2.66, 2),
 ('轮程序员修养之道', 3.66, 3),
 ('好好活着', 88.88, 3);
 # 没有被关联的字段,插入依旧错误
 mysql>: insert into book(name, price, publish_id) values ('打脸之道', 0.3, 4);  # 失败
 ​
 ​
 # 更新:直接更新被关联表的(publish) 主键,关联表(book) 外键 会级联更新
 mysql>: update publish set id=10 where id=1;
 # 更新:直接更新关联表的(book) 外键,修改的值对应被关联表(publish) 主键 如果存在,可以更新成功,反之失败
 mysql>: update book set publish_id=2 where id=4;  # 成功
 mysql>: update book set publish_id=1 where id=4;  # 失败
 ​
 ​
 # 删:
 # 删被关联表,关联表会被级联删除
 mysql>: delete from publish where id = 2;
 ​
 # 删关联表,被关联表不会发生变化
 mysql>: delete from book where publish_id = 3;
 # 假设:书与作者也是 一对多 关系,一个作者可以出版多本书
 create table book(
  id int primary key auto_increment,
    name varchar(64) not null,
    price decimal(5, 2) default 0,
    publish_id int,  # 一对多的外键不能设置唯一
     foreign key(publish_id) references publish(id)
     on update cascade
     on delete cascade
     
     # 建立与作者 一对多 的外键关联
    author_id int,  
     foreign key(author_id) references author(id)
     on update cascade
     on delete cascade
 );

多对多

 # 多对多:一定要创建第三张表(关系表),每一个外键值不唯一,看可以多个外键建立联合唯一
 ​
 mysql>: drop table author;
 mysql>: drop table author_detail;
 mysql>: drop table book;
 mysql>: drop table publish;
 ​
 # 作者(author):id, name, age
 create table author(
  id int primary key auto_increment,
    name varchar(64),
    age int unsigned default 0
 );
 ​
 # 出版社(publish):id, name, address
 create table publish(
  id int primary key auto_increment,
    name varchar(64),
    address varchar(256)
 );
 ​
 # 作者与出版社关系表:id, author_id, publish_id
 create table author_publish(
  id int primary key auto_increment,
     # 关系表一定有多个外键,关联着多张表
     # 关联作者表
    author_id int,
     foreign key(author_id) references author(id)
     on update cascade
     on delete cascade,
     # 关联出版社表
    publish_id int,
     foreign key(publish_id) references publish(id)
     on update cascade
     on delete cascade,
     # 建立两个字段的联合唯一
     unique(author_id, publish_id)
 );
 ​
 # 注:关系表 关联着 作者 和 出版社 两张表,在表结构上 作者 与 出版社 两表键没有任何关系
 ​
 ​
 # 增:两张被关联表,没有前后关系,但关系表必须在两个表都提供数据后才能进行 关系匹配
 mysql>: insert into author(name, age) values('ruakei', 67),('engo', 76),('Lxx', 3);
 mysql>: insert into publish(name, address) values('老男孩出版社', '上海'),('小女孩出版社', '北京');
 ​
 # 操作关系表:
 mysql>: insert into author_publish(author_id, publish_id) values(1,1),(1,2),(2,1),(2,2),(3,1);
 ​
 # 关系表操作:增、删、改,只要两张被关系表有提供对应的操作数据,都可以操作成功,且对两张被关系表没有影响
 ​
 ​
 # 操作两张被关系表:
 # 增:不会影响关系表
 mysql>: insert into publish(name, address) values('西交大出版社', '西安');
 # 改:关系表都会级联更新
 mysql>: update publish set id=10 where id=1;
 # 删:关系表都会级联删除
 mysql>: delete from author where name='ruakei';

mysql中,表与表之间的关系的更多相关文章

  1. mysql中把一个表的数据批量导入另一个表中

    mysql中把一个表的数据批量导入另一个表中   不管是在网站开发还是在应用程序开发中,我们经常会碰到需要将MySQL或MS SQLServer某个表的数据批量导入到另一个表的情况,甚至有时还需要指定 ...

  2. mysql中的回表查询与索引覆盖

    了解一下MySQL中的回表查询与索引覆盖. 回表查询 要说回表查询,先要从InnoDB的索引实现说起.InnoDB有两大类索引,一类是聚集索引(Clustered Index),一类是普通索引(Sec ...

  3. MySQL中的联结表

    使用联结能够实现用一条SELECT语句检索出存储在多个表中的数据.联结是一种机制,用来在一条SELECT语句中关联表,不是物理实体,其在实际的数据库表中并不存在,DBMS会根据需要建立联结,且会在查询 ...

  4. MySQL中的联表查询与子查询

    0.准备数据 1.内连接:INNER JOIN 2.左连接:LEFT JOIN 3.右连接:RIGHT JOIN 4.USING子句 扩展知识点: 0.表别名的使用: 1.group by的用法 2. ...

  5. mysql中如何删除表上的索引?删除索引?

    需求描述: 今天在做SQL的优化的时候,想要把mysql中某个表上的索引删除掉,突然忘记语法了,找到帮助,在此记录下 操作过程: 1.查看表上的索引 show index from ti_o_sms; ...

  6. 用命令从mysql中导出/导入表结构及数据

    在命令行下mysql的数据导出有个很好用命令mysqldump,它的参数有一大把,可以这样查看:mysqldump最常用的:mysqldump -uroot -pmysql databasefoo t ...

  7. mysql中delete的表别名使用方法

    在 mapper.xml 中的 dynamicWhere 动态查询中使用了表别名,Delete 语句引用了动态查询,如下: <delete id="delete" param ...

  8. 你了解MySQL中的多表联合查询吗?

    前言: 多表联合查询,其实就是我们MySQL中的join语句,经常会看到有人说join非常影响性能,不建议使用,你知道这是为什么呢?我们究竟可不可以用呢? 测试数据: CREATE TABLE `t2 ...

  9. 数据库MySQL中关于“多表关联更新”的那些事

    在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...

  10. mysql中查看所有表、表字段、表注释、字段注释

    查看所有表和表注释 select TABLE_NAME, TABLE_COMMENT from INFORMATION_SCHEMA.Tables where table_schema = '某数据库 ...

随机推荐

  1. 利用Pandas和matplotlib分析我爱我家房租区间频率

    前几天利用python爬取了我爱我家的租房的一些数据,就想着能不能对房租进行一波分析,于是通过书籍和博客等查阅了相关资料,进行了房租的区间分析.不得不说,用python做区间分析比我之前用sql关键字 ...

  2. 阿里云视频云正式支持AV1编码格式 为视频编码服务降本提效

    今天我们要说的 AV1 可不是我们平时说的 .AVI 文件格式,它是由AOM(Alliance for Open Media,开放媒体联盟)制定的一个开源.免版权费的视频编码格式,可以解决H.265昂 ...

  3. sql2008 误操作还原至指定时间点

    --drop database db --创建一个测试库 create database db go --备份一个完整备份文件 backup database db to disk = 'd:\db. ...

  4. [CSP-S模拟测试]:木板(数学)

    题目传送门(内部题68) 输入格式 输入有若干行,每行一个整数$N$,以$0$结束 输出格式 每行一个整数表示方案数,方案不同当且仅当$E$.$F$.$G$的坐标不同 样例 样例输入: 1020100 ...

  5. Ehrenfeucht–Fraïssé game back-and-forth games

    w https://en.wikipedia.org/wiki/Ehrenfeucht–Fraïssé game

  6. Log4net记录日志到本地或数据库

    OperatorLog /****** Object: Table [dbo].[OperatorLog] Script Date: SET ANSI_NULLS ON GO SET QUOTED_I ...

  7. linux中也有闹钟alarm, timer, stopwatch, world clock 等等

    stopwatch和timer的区别? timer叫计时器, 是先给出一个时间, 然后从现在开始, 倒数, 减少, 直到时间为0 stopwatch 叫跑錶, 则是从现在开始, 往后 增加时间, 事先 ...

  8. CyclicBarrier 源码分析

    CyclicBarrier CyclicBarrier 是一个同步辅助类,它允许一组线程互相等待,直到到达某个公共屏障点 (common barrier point) 之后同时释放执行.CyclicB ...

  9. javamail 附件以及正文加图片

    直接上代码 import java.io.IOException; import java.io.InputStream; import java.util.Date; import java.uti ...

  10. 新手解惑:nginx&php-fpm&fastcgi 是什么关系

    首先,CGI是干嘛的?CGI是为了保证web server传递过来的数据是标准格式的,方便CGI程序的编写者.   web server(比如说nginx)只是内容的分发者.比如,如果请求/index ...