MySQL基础之数据管理【4】
外键约束的使用(只有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】的更多相关文章
- MySQL基础之数据管理【3】
MySQL中的多表联查 --查询emp的id username age depName create table emp( id int unsigned auto_increment key, us ...
- MySQL基础之数据管理【5】
子查询的使用 select 字段名称 from tbl_name where col_name=(select col_name from tbl_name); --内层语句查询的结果可以作为外层语句 ...
- MySQL基础之数据管理【2】
where条件筛选记录 select id,username,age from uesr where id=5; alter table user add userDesc varchar(100); ...
- MySQL基础之数据管理【1】
添加记录 insert [into] tbl_name[(col_name,...)] {value|values}(values...); --不指定字段名称时需要按照建表时的字段顺序给每一个字段赋 ...
- MySQL基础----py全栈
目录 MySQL基础----py全栈 一.引言 1.什么是数据? 2.什么是数据库(DB)? 3.什么是数据库管理系统(DBMS)? 4.什么是数据库系统? 5.数据库管理系统由来 6.什么是数据模型 ...
- Mysql基础代码(不断完善中)
Mysql基础代码,不断完善中~ /* 启动MySQL */ net start mysql /* 连接与断开服务器 */ mysql -h 地址 -P 端口 -u 用户名 -p 密码 /* 跳过权限 ...
- MYSQL基础操作
MYSQL基础操作 [TOC] 1.基本定义 1.1.关系型数据库系统 关系型数据库系统是建立在关系模型上的数据库系统 什么是关系模型呢? 1.数据结构可以规定,同类数据结构一致,就是一个二维的表格 ...
- 【夯实Mysql基础】记一次mysql语句的优化过程
1. [事件起因] 今天在做项目的时候,发现提供给客户端的接口时间很慢,达到了2秒多,我第一时间,抓了接口,看了运行的sql,发现就是 2个sql慢,分别占了1秒多. 一个sql是 链接了5个表同时使 ...
- MySQL基础(非常全)
MySQL基础 一.MySQL概述 1.什么是数据库 ? 答:数据的仓库,如:在ATM的示例中我们创建了一个 db 目录,称其为数据库 2.什么是 MySQL.Oracle.SQLite.Access ...
随机推荐
- css3 @page
<!doctype html> <html> <head> <meta charset="utf-8"> <title> ...
- 如何实现一台服务器同时运行两个php版本
有需要学习交流的友人请加入交流群的咱们一起,有问题一起交流,一起进步!前提是你是学技术的.感谢阅读! 点此加入该群jq.qq.com 假设您已经安装了Apache,为这两个项目创建了虚拟主机,并添加 ...
- 【linux命令】软连接和硬链接的区别(ln命令)
Linux 文件系统把硬盘分为三个部分:超级块.inode 列表.数据区 inode 指示:该文件的数据存放在数据区的哪些块内.因为这个“映射”关系不能变更,因此,inode 相当于代表着文件本身.( ...
- Privacy Violation 侵犯隐私
- springboot(二):bootstrap和application有什么区别?
“SpringBoot专注于快速方便的开发单个个体微服务. SpringCloud是关注全局的微服务协调整理治理框架,它将SpringBoot开发的一个个单体微服务整合并管理起来, 为各个服务之间提供 ...
- GO基础之文件操作
一.文件操作的基本API func main() { //绝对路径 fileInfo , err := os.Stat("E:/a.txt") fileInfo , err = o ...
- report framework
大标题 摘要: 关键字: 1 第一题:(爬虫) 1.1 问题分析及解题思路 本题需要爬取xxxx的数据,运用Python的Request爬虫框架 1.2 解题流程及代码 1.2.1定义爬虫类-构造函数 ...
- Git实战指南----跟着haibiscuit学Git(第十一篇)
笔名: haibiscuit 博客园: https://www.cnblogs.com/haibiscuit/ Git地址: https://github.com/haibiscuit?tab=re ...
- 微信小程序模板(template)和组件的区别
template模块主要是展示,方法需要在使用template的页面中定义,对于通用的数据,最先想到或者理应是template,但是template有个缺点,那就是只是页面效果,不会有对应的js操作. ...
- js-02-循环语句
循环语句分类{ for while do ( ) while } 一.for循环语句和for循环的嵌套 for循环格式eg: <script> var sim = 0; for(var i ...