外键:

·一对多

·多对多

·一对一

·修改表

·复制表

 

主键:

 

rimary key auto_increment(primary key是主键通常和auto_increment自动增加混合使用)

把所有数据存放到一张表中的弊端:

  1. 组织结构不清晰
  2. 浪费硬盘空间
  3. 扩展性差

一对多

create table school(
id int primary key auto_increment,    #primary key设置主键
school_name char(60)
);
create table class(
id int primary key auto_increment,
class_name char(40),
school_id int,
foreign key(school_id) references school(id)    #设置外键
on update cascade    #允许数据更新
on delete cascade    #允许数据删除
);

insert into school(school_name) values
('上海虹桥校区'),
('上海康桥校区');
insert into class(class_name,school_id) values
('python1班',1),
('python2班',2),
('python3班',1);

 

删除数据:

mysql> delete from school where id=2;

删除数据后school中的id字段为2的数据和class表中school_id字段为2的数据都会删除掉。

 

更新数据:

mysql> update school set id=3 where school='上海虹桥校区';

更新主键school中的id数据后,应为和class主外键绑定,外键class中的school_id字段也进行更新。

 

多对多

针对多对多这样的情况不能直接进行两个表关系绑定,不论怎么创建都会报错,新增一张表,这个表来进行两个表的关系绑定

图书表与作者表之间的关系
在两张表的角度:
1、在图书的角度:一本书可以对应一个作者也可以对应多个作者
2、在作者角度:一个作者可以写多本书
双方都能根据一条数据记录对应对方多条记录,这种关系就是多对多
面对这种双方相互对应没有办法直接建立关系,解决办法是另外建立一张关系表
create table author(
id int primary key auto_increment,
name char(16)
);
create table book(
id int primary key auto_increment,
book_name char(16),
price int
);
insert into author(name) values('egon'),('alex'),('xxx'); insert into book(book_name,price) values('python',20000),
('降龙十八掌',99.99),
('葵花宝典',9.9),
('九阴真经',8.8); create table author_to_book(
id int primary key auto_increment,
author_id int,
book_id int,
foreign key(author_id) references author(id)
on update cascade
on delete cascade,
foreign key(book_id) references book(id)
on update cascade
on delete cascade
); insert into author_to_book(author_id,book_id) values
(1,3),
(1,4),
(2,1),
(2,3),
(2,4),
(3,4);

#一对一
一张表强制拆分成为了两张表
create table customer(
id int primary key auto_increment,
name char(20) not null,
qq char(10) not null,
phone char(11) not null default '11111111111'
);
create table student(
id int primary key auto_increment,
class_name char(20) not null,
customer_id int unique, #该字段唯一
foreign key(customer_id) references customer(id)
on delete cascade
on update cascade
); insert into customer(name,qq,phone) values
('egon','107170955','13579035789'),
('own','107170966','13579035469'),
('xxx','100000000','13333035789'),
('tank','106171955','13579035789')
;
insert into student(class_name,customer_id) values
('语文','1'),
('数学','2'),
('英语','3'),
('地理','4');

 

Mysql主键外键操作的更多相关文章

  1. 1、Mysql无法创建外键的原因 2、MySql 外键约束 之CASCADE、SET NULL、RESTRICT、NO ACTION分析和作用

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  2. [原创]MYSQL中利用外键实现级联删除和更新

    MySQL中利用外键实现级联删除.更新 MySQL支持外键的存储引擎只有InnoDB,在创建外键的时候,要求父表必须有对应的索引,子表在创建外键的时候也会自动创建对应的索引.在创建索引的时候,可以指定 ...

  3. Mysql无法创建外键的原因

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  4. 转!!!Mysql无法创建外键的原因

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  5. (转)mysql 无法设置外键的原因总结

    在Mysql中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  6. mysql foreign key(外键) 说明与实例

    一,什么是foreign key,及其完整性 个人觉得,foreign key就是表与表之间的某种约定的关系,由于这种关系的存在,我们能够让表与表之间的数据,更加的完整,关连性更强.关于完整性,关连性 ...

  7. 第15课-数据库开发及ado.net-数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库

    第15课-数据库开发及ado.net 数据库介绍,主键,外键,启动数据库,数据库身份验证方式,建表,分离数据库 1.  学习方法 2.  多涨见识 3.  比自己强的人一起,学习更强:比自己更聪明的人 ...

  8. Mysql无法创建外键的原因 !!!

    在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  9. Mysql学习总结(19)——Mysql无法创建外键的原因

    在MySQL中创建外键时,经常会遇到问题而失败,这是因为Mysql中还有很多细节需要我们去留意,我自己总结并查阅资料后列出了以下几种常见原因. 1.  两个字段的类型或者大小不严格匹配.例如,如果一个 ...

  10. MySQL 中的外键

    表和表之间可存在引用关系,这在抽象数据到表时,是很常见的.这种联系是通过在表中创建外键(foreign key)来实现的. 比如一个订单,可能关联用户表和产品表,以此来记录谁买了什么产品. 约定两个概 ...

随机推荐

  1. NODEJS 使用 sqlite3 本地文件数据库

    npm install sqlite3 var sqlite3 = require('sqlite3').verbose();var db = new sqlite3.Database('WebFil ...

  2. Entity Framework 6 Code First的简单使用和更新数据库结构

    一.安装Entity Framework 6 在项目中右击选择“管理NuGet程序包",联机搜索Entity Framework,点击安装 二.配置数据库连接 在App.config中加入数 ...

  3. JAVA->查询并显示输入根目录下全部的文件所在目录路径

    public static boolean qf(File f,boolean a){      boolean b=false;   if(a==true){      File[] fl=f.li ...

  4. gulp常用插件之gulp-sourcemaps使用

    更多gulp常用插件使用请访问:gulp常用插件汇总 gulp-sourcemaps这是一款用来生成映射文件的一个插件,SourceMap 文件记录了一个存储源代码与编译代码对应位置映射的信息文件.我 ...

  5. LaTeX技巧001:LaTeX中输入大小写罗马数字

    \uppercase\expandafter{\romannumeral20} \romannumeral20 前者将输入大写罗马数字20, 后者将输入小写罗马数字20.

  6. LeetCode 572. 另一个树的子树

    题目链接:https://leetcode-cn.com/problems/subtree-of-another-tree/ 给定两个非空二叉树 s 和 t,检验 s 中是否包含和 t 具有相同结构和 ...

  7. multiprocessing 方法解析:

    以上是关于进程池的使用,截下来开始介绍如何使用多进程,由于multiprocessing 实现比concurrent.futures 实现更加底层这里还是推荐大家使用concurrent.future ...

  8. Codeforces Round #614 (Div. 2) D

    变色失败 只加8分 距离变色只差5分 B题没想到那么简单,结论秒猜,不敢交,傻傻验证5分钟. C题也想了码了好一会儿,我动态维护set做的. 1小时3题,整体难度好像没以前那么大了?(虽然也不强,但比 ...

  9. BZOJ 2467: [中山市选2010]生成树

    有一种图形叫做五角形圈.一个五角形圈的中心有1个由n个顶点和n条边组成的圈.在中心的这个n边圈的每一条边同时也是某一个五角形的一条边,一共有n个不同的五角形.这些五角形只在五角形圈的中心的圈上有公共的 ...

  10. .NetCore3.0短网址项目

    Wei.TinyUrl 基于.NetCore3.0 + Mysql开发的短网址项目 项目地址:https://github.com/a34546/Wei.TinyUrl 演示效果: 快速开始 1. 修 ...