"""
 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. Web应用防火墙云WAF详细介绍

    Web应用防火墙,或叫Web应用防护系统(也称为:网站应用级入侵防御系统.英文:Web Application Firewall,简称: WAF).利用国际上公认的一种说法:Web应用防火墙是通过执行 ...

  2. github上.md的编写

    # algs4 一:大标题 =========== 二:中标题 ------------ 三:1~6级标题 # 一级标题 ## 二级标题 ### 三级标题 #### 四级标题 ##### 五级标题 # ...

  3. Spring——框架

    [定义] 框架就是制定一套规则或规范(思想),大家(程序员)在该规范或者规则(思想)下工作. 或者说是使用别人搭好的舞台,你来表演. [特点] ——半成品 ——封装了特定的处理流程和控制逻辑 ——成熟 ...

  4. Codeforces 864E - Fire(dp)

    原题连接:http://codeforces.com/problemset/problem/864/E 题意:一个人想从大火中带走一些东西.每次他只能带一个,耗时ti ,价值为pi, 当总时间超过di ...

  5. HDU1232 畅通工程(并查集)

    #include<iostream> using namespace std; ]; int findx(int x) { while(num[x]!=x)x=num[x]; return ...

  6. DB数据库的基本操作

    启动 MongoDB 服务 sudo service mongodb start 进入 MongoDB 命令行操作界面,在命令行中敲 exit 可以退出.mongo 创建数据库 use db 命令查看 ...

  7. fengmiantu4

  8. debugfs linux rm 删除 恢复 Attempt to read block from filesystem resulted in short read while opening filesystem

    w 删除具有空字符的文件 反斜杠来转义下一个字符 rm -R Samples\ -\ Copy well@well:/home/etc/project/apilinux/MarketplaceWebS ...

  9. 树的基本概念以及java实现二叉树

    树具有的特点有: (1)每个结点有零个或多个子结点 (2)没有父节点的结点称为根节点 (3)每一个非根结点有且只有一个父节点 (4)除了根结点外,每个子结点可以分为多个不相交的子树.   树的基本术语 ...

  10. 在静态页面中使用 Vue.js

    在静态页面中使用 Vue.js 不使用Node.js, NPM, Webpack 等, 在静态页中使用Vue.js. 包括路由, 单文件组件. 1. 创建index.html index.html做为 ...