1.外键: 用来建立两张表之间的关系
- 一对多
- 多对多
- 一对一

研究表与表之间的关系:
  1.定义一张 员工部门表
    id, name, gender, dep_name, dep_desc

  - 将所有数据存放在一张表中的弊端:
    1.结构不清晰 ---> 不致命
    2.浪费空间 ---> 不致命
    3.可扩展性极差 ---> 不可忽视的弊端
      - 类似于将所有python代码存放在一个py文件中,强耦合到一起了----> 解耦合 ----> 拆分表

    - 拆分表解决以上问题.

    - 需要给两张表之间,建立一种强有力的关系, 使用 “外键”

- !!!!! ****** 如何确认表与表之间的关系是 (一对多、多对多、一对一)
  - 注意: 要确立两张表之间的关系,必须站在两个位置去思考:
    - 站在员工表的位置: 多个员工能否对应一个部门? 能!!!

      - 员工与部门: 多 对 一

        - 员工表单向 多 对 一 部门表

    - 站在部门表的位置: 多个部门能够对应一个员工? 不能!!!

    总结: 凡是单向 多 对 一 的表关系,称之为 一对多 的外键关系。

  - 外键: 语法: foreign key(当前表中建立关系的外键字段) references 被关联表名(id)

- 一对多

# 创建两张表
1.必须先建立被关联表,再建立关联表

# 被关联表:
dep:
  create table dep(
    id int primary key auto_increment,
    dep_name varchar(16),
    dep_desc varchar(255)
  ); # 关联表:
emp:
  create table emp(
    id int primary key auto_increment,
    name varchar(16),
    age int,
    gender enum('male', 'female', 'others') default 'male',
    dep_id int not null,
    foreign key(dep_id) references dep(id)
  );

注:KEY中MUL代表外键

# 插入数据:
- 1.必须先插入被关联表(dep)的数据,再插入关联表(emp)的数据。

# dep:
insert into dep(dep_name, dep_desc) values('nb_外交部', '国际形象大使部门'),
('sb_教学部', '造程序员部门!!!!'),
('技术部', '技术有限部门'); # emp:
insert into emp(name, age, gender, dep_id)
values('tank', 17, 'male', 1),
('jason', 70, 'male', 2),
('sean', 50, 'male', 2),
('egon', 88, 'male', 2),
('owen', 95, 'female', 3); # 报错,
insert into emp(name, age, gender, dep_id) values('大饼', 100, 'others', 999);

-级联更新与级联删除(把关联数据一起变更)

  - on update cascade
  - on delete cascade

-创建表

#被关联表:
dep2:
create table dep2(
id int primary key auto_increment,
dep_name varchar(16),
dep_desc varchar(255)
);
#关联表:
emp2:
create table emp2(
id int primary key auto_increment,
name varchar(16),
age int,
gender enum('male','female','others') default 'male',
dep_id int not null,
foreign key(dep_id) references dep2(id)
on update cascade
on delete cascade
);

- 插入数据

#dep:
insert into dep2(dep_name,dep_desc)values('nb_外交部','国际形象大使部门'),
('sb_教学部','造程序员部门!!!!'),('技术部','技术有限部门');
#emp:
insert into emp2(name,age,gender,dep_id)
values('tank',17,'male',1),
('jason',70,'male',2),
('sean',50,'male',2),
('egon',88,'male',2),
('owen',95,'female',3); #报错
insert into emp(name,age,gender,dep_id)values('大饼',100,'others',999);

- 更新数据或删除数据

-更新记录
update dep2 set id=200 where id=1; -删除记录
delete from dep2 where id=200;

因为级联,关联数据一起变更为200

注意:mysql中没有多对一,只有一对多

- 多对多

也必须站在两张表的位置去思考;

- 错误示范:

#- 创建book表
create table book(
id int primary key auto_increment,
title varchar(20),
price int,
book_content varchar(255),
author_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
); #- 创建author表
create table author(
id int primary key auto_increment,
name varchar(16),
age int,
book_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
);

- 问题: 无法知道哪张表是被关联表

- 利用第三张表,为两张表建立“多对多外键关系”。

#-book:
create table book(
id int primary key auto_increment,
title varchar(20),
price int,
book_content varchar(255)
);
#-auther:
create table author(
id int primary key auto_increment,
name varchar(16),
age int
);
#-book2author:
create table book2author(
id int primary key auto_increment,
book_id int,
author_id int,
foreign key(book_id) references book(id)
on update cascade
on delete cascade,
foreign key(author_id) references author(id)
on update cascade
on delete cascade
);

- 插入数据

#- book
insert into book(title, price, book_content) values
('金瓶mei', 199, '讲述朦胧时光的小故事'),
('python从入门到断气', 2000, '学习如何一夜秃头'),
('三体', 200, '跟着大佬进入宇宙奇幻世界')
; - author
insert into author(name, age) values
('egon', 68),
('jason', 88); - book2author:
insert into book2author(book_id, author_id) values
(1, 1),
(1, 2),
(2, 2),
(3, 1); # 报错, 插入的数据,book_id, author_id必须存在
insert into book2author(book_id,author_id) values(4, 4); # 更新或删除
#更新
update book set price =666 where id =1;
update book set id=4 where id=1;
#删除
delete from book where id=4; (会删除关联表内容)

- 一对一:

- user_info:
  id, name, age, gender, hobby, id_card

- user:
  id , name, age, detail_id(外键)

- detail:
  id, gender, hobby, id_card

user与detail表建立了 一对一的外键 关系。
foreign key 应该建在 使用频率较高的一方。

-创建表

#被关联表
create table customer(
id int primary key auto_increment,
name varchar(16),
media varchar(32)
);
#关联表
create table student(
id int primary key auto_increment,
addr varchar(255),
phone_char(11),
id_card char(18), # 外键必须设置成唯一的
customer_id int unique,
forign key(customer_id) references customer(id)
on update cascade
on delete cascade
);

- 插入数据

insert into customer(name,media) values
('hcy','facebook'),
('zsb1','ig'),
('zsb2','vk'),
('hb','探探'); insert into student(addr,phone,id_card,customer_id) values
('上海', '', '', 1),
('北京', '', '', 2); # 报错,一对一,关系必须 一一对应
insert into student(addr, phone, id_card, customer_id) values ('上海', '', '', 1); - 插入数据:
insert into

修改表的操作

- 语法: 注意: mysql 关键字不区分大小写
1. 修改表名
ALTER TABLE 表名 RENAME 新表名;

2. 增加字段
ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…],ADD 字段名 数据类型 [完整性约束条件…]; # 添加到最后一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] FIRST; # 添加到第一列

ALTER TABLE 表名 ADD 字段名 数据类型 [完整性约束条件…] AFTER 字段名; # 添加到某一列之后

3. 删除字段
ALTER TABLE 表名 DROP 字段名;

4. 修改字段
ALTER TABLE 表名 MODIFY 字段名 数据类型 [完整性约束条件…]; # 修改数据类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 旧数据类型 [完整性约束条件…]; # 修改字段名,保留字段类型

ALTER TABLE 表名 CHANGE 旧字段名 新字段名 新数据类型 [完整性约束条件…]; # 修改字段名与字段类型

- 复制表的操作:
复制表结构+记录 (key不会复制: 主键、外键和索引)
mysql> create table new_service select * from service;

只复制表结构
# 将select * from service where 1=2; ---> 不要真实数据,需要表结构
mysql> create table new_customer select * from customer where 1=2;

MySQL数据库 外键,级联, 修改表的操作的更多相关文章

  1. MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作)

    MySQL的外键,修改表,基本数据类型,表级别操作,其他(条件,通配符,分页,排序,分组,联合,连表操作): a.创建2张表 create table userinfo(nid int not nul ...

  2. 第二百八十节,MySQL数据库-外键链表之一对多,多对多

    MySQL数据库-外键链表之一对多,多对多 外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索 ...

  3. MySQL数据库(4)_MySQL数据库外键约束、表查询

    一.外键约束 创建外键 --- 每一个班主任会对应多个学生 , 而每个学生只能对应一个班主任 ----主表 CREATE TABLE ClassCharger( id TINYINT PRIMARY ...

  4. MySQL数据库--外键约束及外键使用

    什么是主键.外键关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键. 比如: 学生表(学号,姓名,性别,班级) 其中每个学生的学号是唯 ...

  5. mysql数据库外键、主键详解

    一.什么是主键.外键: 关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键 比如  学生表(学号,姓名,性别,班级) 其中每个学生的学 ...

  6. Database学习 - mysql 数据库 外键

    外键 外键约束子表的含义:如果在父表中赵达不到候选键,则不允许在子表上进行insert/update 外键预约对父表的含义:在父表上进行update/delete以更新或删除子表中有一条或多条对应匹配 ...

  7. MySQL数据库-外键链表之一对多,多对多

    外键链表之一对多 外键链表:就是a表通过外键连接b表的主键,建立链表关系,需要注意的是a表外键字段类型,必须与要关联的b表的主键字段类型一致,否则无法创建索引 一对多:就是b表的某一个字段值对应a表外 ...

  8. (4)MySQL的外键(不同表之间的数据关联)

    问题:下列这张表中部门等列名下输入的数据没有约束,那么可以随便填写符合规则的数据但是不符合实际需求的值,这样就造成了不符合规则的数据在表中存在,外键就是为了解决这个问题,管理员可以在另一张表中设置好符 ...

  9. 黑马MySQL数据库学习day03 级联 多表查询 连接和子查询 表约束

    /* 存在外键的表 删表限制: 1.先删除从表,再删除主表.(不能直接删除主表,主表被从表引用,尽管实际可能还没有记录引用) 建表限制: 1.必须先建主表,再建从表(没有主表,从表无法建立外键关系) ...

随机推荐

  1. 01_javaSE面试题:自增变量

    开启刷面试题,都是根据视频进行刷面试题的 自增变量,只要记住两点 i++ 是先赋值后计算 ++i 是先计算后赋值 看下面的代码 int i = 1; i = i++; int j = i++; int ...

  2. Python进阶-XVI 继承 单继承 多继承

    一.初识继承 1.引入继承 class A(object): pass # 父类,基类,超类 class B: pass # 父类,基类,超类 class A_son(A, B): pass # 子类 ...

  3. CF1178D Prime Graph

    题目链接 题意 构造一张有\(n(3\le n\le 1000)\)个点的无向图(无重边和自环).满足: 边的总数为素数 所有点的度数均为素数 输出方案 solution 如果所有点的度数确定了.那么 ...

  4. [LOJ 6288]猫咪[CF 700E]Cool Slogans

    [LOJ 6288]猫咪[CF 700E]Cool Slogans 题意 给定一个字符串 \(T\), 求一个最大的 \(K\) 使得存在 \(S_1,S_2,\dots,S_k\) 满足 \(S_1 ...

  5. Azure EA (1) 查看国内Azure账单

    <Windows Azure Platform 系列文章目录> 本文介绍的是国内由世纪互联运维的Azure China 有关Azure EA Portal的详细内容,可以参考我的GitHu ...

  6. springboot2 中Druid和ibatis(baomidou) 遇到org.apache.ibatis.binding.BindingException: Invalid bound statement (not found): com.iflytek.pandaai.service.multi.mapper.TanancyMapper

    调用mapper中任何方法都会出现类似的错误 org.apache.ibatis.binding.BindingException: Invalid bound statement (not foun ...

  7. 响应国家号召 1+X 证书 Web 前端开发考试模拟题

    1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http ...

  8. redis之漏斗限流

    Redis 4.0 提供了一个限流 Redis 模块,它叫 redis-cell.该模块也使用了漏斗算法,并提供了原子的限流指令.有了这个模块,限流问题就非常简单了.

  9. SqlBulkCopy将DataTable中的数据批量插入数据库中

    #region 使用SqlBulkCopy将DataTable中的数据批量插入数据库中 /// <summary> /// 注意:DataTable中的列需要与数据库表中的列完全一致.// ...

  10. sso单点登录的入门(Session跨域、Spring-Session共享)

    1.单点登录,就是多系统,单一位置登录,实现多系统同时登录的一种技术.单点登录一般是用于互相授信的系统,实现单一位置登录,全系统有效的. 区分与三方登录(第三方登录) ,三方登录:某系统,使用其他系统 ...