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 ... 
随机推荐
- Android 再次打开APP进入按Home键退出时的界面(thisTaskRoot)
			问题 Android 设置页面的启动模式为 singletask 之后,当按Home 退出时,再重新打开应用,还会进入首启动页.就会造成一些应用需要重新登录,当前页数据丢失等问题 解决 去除启动页的 ... 
- Android BGradualProgress 多种渐变、直角or弧角、进度条、加载条
			可实现多种渐变.直角or弧角.进度条.加载条 (Various gradient, right or arc angle, progress bar and loading bar can be re ... 
- MySQL数据库~~~~初识、基础数据类型
			一 数据库初识 1.1 什么是数据库 数据库(DataBase,简称DB),简而言之可视为电子化的文件柜----存储电子文件的处所,用户可以对文件中的数据运行新增,截取,更新,删除等操作. 所谓数据库 ... 
- 安装最新版 windows正版软件地址(visio,office)
			链接地址为 https://msdn.itellyou.cn/ 进入后直接搜 然后复制链接使用迅雷下载 很快完成 但是都是原生的 需要破解 提供一个visio的破解软件 亲测有效 链接:https:/ ... 
- Beta版本演示
			小组信息 组名:斗地组 组长博客:地址 组内成员: 组员 学号 林涛(组长) 031702616 童圣滔 031702117 林红莲 031702213 潘雨佳 031702214 覃鸿浩 03170 ... 
- Git 原理简谈
			Git 本身是一个对 reference 进行管理的数据库,reference 指的是对原始数据的引用.通过对原始数据的追踪,那么就可以做到对版本的控制.Git 使用一个 DAG 存储了整个的refe ... 
- 我这样回答了Spring 5的新特性,面试官对我刮目相看
			最近,有一个小伙伴拿到了自己满意的Offer,和他交谈的过程中得知他面试官问他关于Spring的问题比较多,其中最让面试官满意的就是自己回答关于Spring 5的知识点回答的不错. Spring5于2 ... 
- Spring Boot中使用Swagger2构建强大的RESTful(最新全,无坑)
			1:说明 网上这类文章 太多, 一搜一大把 ,但是要不是知识太过于老旧,就是配置没有说名清楚,你的项目按照他的配置却不能正常运行: 所以本文的目的: 配置swagger 2 那swagger 1 不 ... 
- vs2017 C# ActiveX浏览器插件 创建 发布 C# windows窗体控件库(.NET Framework)注意事项
			vs2017需要安装插 插件下载地址:https://marketplace.visualstudio.com/items?itemName=VisualStudioProductTeam.Micro ... 
- TensorFlow实现简单线性回归示例代码
			# -*- coding: utf-8 -*- import tensorflow as tf import numpy as np import matplotlib.pyplot as plt d ... 
