外键约束的使用(只有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. Android Healthd电池服务分析

    healthd healthd是安卓4.4之后提出来的,监听来自kernel的电池事件,并向上传递电池数据给framework层的BatteryService.BatteryService计算电池电量 ...

  2. Vim 基本的使用

    三种模式 按 ESC 进入命令模式 命令模式下输入 Shift + : 进入末行模式 命令模式下输入插入命令,如(i,a,o) 进入输入模式 进入 vim 文件名 vim直接编辑一个文件,如果是已经存 ...

  3. javax.servlet.ServletException: Could not resolve view with name 'order/list' in servlet with name 'dispatcherServlet'

    javax.servlet.ServletException: Could not resolve view with name 'order/list' in servlet with name ' ...

  4. B树概述与简单应用示例(C#)

    引言: 天不生仲尼,万古如长夜.在计算机科学中,也有一个划时代的发明,B树(多路平衡查找树)及其变体(B树,b*树,b+树): 由德国科学家(鲁道夫·拜尔 Rudolf Bayer),美国科学家(爱德 ...

  5. Hive concat函数连接后结果为null

    Hive concat函数连接后结果为null concat函数是用来连接字符串的 使用示例: select concat('Hello','World','Java'); 运行结果: 最近我们在做需 ...

  6. Oracle - exp实战

    一.概述 exp/imp是oracle中的一个逻辑导出和导入工具,假想一个场景,当我们使用exp命令在对用户进行导出的时候,如果该用户中的某些表的数据有修改,或表结构进行了修改,或者表被删除,那么我们 ...

  7. 在 ASP.NET Core 中启用跨域请求(CORS)

    本文介绍如何在 ASP.NET Core 的应用程序中启用 CORS. 浏览器安全可以防止网页向其他域发送请求,而不是为网页提供服务. 此限制称为相同源策略. 同一源策略可防止恶意站点读取另一个站点中 ...

  8. default(T);

    在泛型类型中,由于泛型类型即可以是引用类型也可以是值类型,所以不能用null来表示默认值.这里通过default来进行.引用类型的default将泛型类型初始化null,值类型的default将泛型类 ...

  9. NSwag.AspNetCore常用功能介绍

    对于asp.net core 下的Swagger,之前一直用Swashbuckle的,因为官方推荐,再加上有老张的博客助力<从壹开始前后端分离[ .NET Core2.0/3.0 +Vue2.0 ...

  10. subprocess之check_out用法

    在python3中使用subprocess的check_out方法时,因为该输出为byte类型,所以如果要查看具体的内容时需要进行转码,如果转码不对话,会影响内容输出的可读性,如下: #1,输出解码不 ...