外键约束的使用(只有InnoDB存储引擎支持外键)

create table news_cate(
id tinyint unsigned auto_increment key comment '编号',
cateName varchar(50) not null unique comment '分类名称',
cateDesc varchar(100) not null default '' comment '分类描述'
)engine=innodb charset=utf8; insert news_cate(cateName) values('国内新闻'),
('国际新闻'),
('娱乐新闻'),
('体育新闻'); create table news(
id int unsigned auto_increment key comment '编号',
title varchar(100) not null unique comment '新闻标题',
content varchar(1000) not null comment '新闻内容',
cateId tinyint not null comment '新闻所属分类编号'
)engine=innodb charset=utf8; insert news(title,content,cateId) values('a1','aaaa1',1),
('a2','aaaa2',1),
('a3','aaaa3',4),
('a4','aaaa4',2),
('a5','aaaa5',3);

将会产生脏数据的操作

delete from news_cate where id=2;
insert news(title,content,cateId) values('a6','aaaa6',45);

解决办法:添加外键(保证数据的一致性和完整性)

--建表时指定外键([constraint 外键名称] foreign key(外键字段名称) references 主表(主键字段名称))
--news中cateId的字段类型和约束条件要与主表news_cate中的id相似
--如果外键字段没有创建索引,MySQL会自动帮我们添加索引
--子表的外键关联的必须是父表的主键
create table news(
id int unsigned auto_increment key comment '编号',
title varchar(100) not null unique comment '新闻标题',
content varchar(1000) not null comment '新闻内容',
cateId tinyint unsigned not null comment '新闻所属分类编号',
constraint cateId_fk_newsCate foreign key(cateId) references news_cate(id)
)engine=innodb charset=utf8; insert news(title,content,cateId) values('a1','aaaa1',1),
('a2','aaaa2',1),
('a3','aaaa3',4),
('a4','aaaa4',2),
('a5','aaaa5',3); --父表中的记录有内容时(比如国内新闻里有新闻就不能删除国内新闻这个类别)不能进行以下操作(没有外键约束的参照操作时)
--插入非法记录
insert news(title,content,cateId) values('b1','bbbb1',8); --新闻类别里没有8,报错
--显示:有外键约束不能添加非法记录
mysql> insert news(title,content,cateId) values('b1','bbbb1',8);
ERROR 1452 (23000): Cannot add or update a child row: a foreign key constraint
fails (`king`.`news`, CONSTRAINT `news_ibfk_1` FOREIGN KEY (`cateId`) REFERENCES `news_cate` (`id`)) --删除或更新父表中的记录
delete from news_cate where id=1; --新闻类别1里有记录不能删除,报错
update news_cate set id=10 where id=1; --新闻类别1里有记录不能更新,报错
--显示:有外键约束不能删除或更新父类记录
mysql> delete from news_cate where id=1;
ERROR 1451 (23000): Cannot delete or update a parent row: a foreign key constraint
fails (`king`.`news`, CONSTRAINT `news_ibfk_1` FOREIGN KEY (`cateId`) REFERENCES `news_cate` (`id`))
--删除子表之后才能删出父表

动态创建外键及删除外键操作

--动态添加外键
--动态添加外键之前表中的记录一定是合法的记录,没有脏值,否则外键添加不成功
alter table tbl_name add [constraint 外键名称] foreign key(外键字段名称) references 主表(主键字段名称); --动态删除外键
alter table tbl_name drop foreign key fk_name; --外键约束的参照操作
--cascade:从父表删除或更新,子表也跟着删除或更新,级联的操作
--set null:从父表删除或更新记录,并设置子表的外键列为null(要保证子表外键的字段可以为null)
--not action|restrict:拒绝对父表做更新或删除操作
alter table news
add foreign key(cateId) references news_cate(id)
on delete cascade on update cascade;

MySQL基础之数据管理【4】的更多相关文章

  1. MySQL基础之数据管理【3】

    MySQL中的多表联查 --查询emp的id username age depName create table emp( id int unsigned auto_increment key, us ...

  2. MySQL基础之数据管理【5】

    子查询的使用 select 字段名称 from tbl_name where col_name=(select col_name from tbl_name); --内层语句查询的结果可以作为外层语句 ...

  3. MySQL基础之数据管理【2】

    where条件筛选记录 select id,username,age from uesr where id=5; alter table user add userDesc varchar(100); ...

  4. MySQL基础之数据管理【1】

    添加记录 insert [into] tbl_name[(col_name,...)] {value|values}(values...); --不指定字段名称时需要按照建表时的字段顺序给每一个字段赋 ...

  5. MySQL基础----py全栈

    目录 MySQL基础----py全栈 一.引言 1.什么是数据? 2.什么是数据库(DB)? 3.什么是数据库管理系统(DBMS)? 4.什么是数据库系统? 5.数据库管理系统由来 6.什么是数据模型 ...

  6. Mysql基础代码(不断完善中)

    Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...

  7. MYSQL基础操作

    MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...

  8. 【夯实Mysql基础】记一次mysql语句的优化过程

    1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...

  9. MySQL基础(非常全)

    MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...

随机推荐

  1. deinit 没执行

    写了一个自定义的UIView,其中包含代理       然后设置UIViewController为此UIView的代理       结果UIViewController里的deinit没执行,导致内存 ...

  2. inux 资源监控分析-pidstat

    pidstat是sysstat工具的一个命令,用于监控全部或指定进程的cpu.内存.线程.设备IO等系统资源的占用情况.pidstat首次运行时显示自系统启动开始的各项统计信息,之后运行pidstat ...

  3. Centos 中使用通过docker 部署.netcore

    此前,我一直觉得,目前网络上的各种各样的技术文章.技术文档已经足够多,任何一种技术,都可以或多或少的在网络上找到教程,或者在qq群里找到前辈解答.所以,我觉得自己在博客上写文章的意义甚少.甚至觉得自己 ...

  4. 让终端更好看--Ubuntu OhMyZsh配置指南

    查看shell列表 cat /etc/shells 如果发现没有zsh就安装 安装zsh sudo apt install zsh 设置默认shell chsh -s $(which zsh) 重启主 ...

  5. Python学习:50 行 Python 代码,带你追到最心爱的人

    程序员世纪难题 人们一提到程序员第一反应就是:我知道!他们工资很高啊!但大部分都是单身狗,不懂得幽默风趣,只是每天穿格子 polo 衫的宅男一个.甚至程序员自己也这样形容自己:钱多话少死的早.程序员总 ...

  6. 汇编 易混淆指令lea offset

    lea 是机器指令,offset 是伪指令. LEA BX, BUFFER ;在实际执行时才会将变量buffer的地址放入bx MOV BX, OFFSET BUFFER ;在编译时就已经计算出buf ...

  7. 一文读懂分布式任务调度平台XXL-JOB

    本文主要介绍分布式任务调度平台XXL-JOB(v2.1.0版本),包括功能特性.实现原理.优缺点.同类框架比较等 基本介绍 项目开发中,常常以下场景需要分布式任务调度: 同一服务多个实例的任务存在互斥 ...

  8. Python高级特性——生成器(generator)

    通过上节的学习,我们知道使用列表生成式,可以直接创建一个列表.但是,有些时候,受到内存的限制等实际情况,列表生成式无法满足.比如,一个长度为1000万的列表,普通内存根本就不够,又或者实际处理的过程中 ...

  9. 爬虫(四):requests模块

    1. requests模块 1.1 requests简介 requests 是一个功能强大.简单易用的 HTTP 请求库,比起之前用到的urllib模块,requests模块的api更加便捷.(本质就 ...

  10. JavaWeb学习——web.xml文件说明

    JavaWeb学习——web.xml文件说明 摘要:本文主要学习了web.xml文件的作用以及如果配置. 是什么 web.xml文件是用来在JavaWeb项目里面初始化配置信息的,比如:访问的首页.S ...