day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)
day42
外键的限制和解决方法
可以添加外键关联的那个字段可以是 被唯一(unique)约束的字段 或者 主键
限制:+
由于外键的使用,致使多个表之间产生了联系,当我们对这些表进行更新或删除操作的时候一直报错,无法达到我们的目的。
解决方法:
删除关联字段再进行自己想完成的操作,接着添加外键关系。
场景
book表和publish表为多对一关系,book表的pid字段外键关联到了publish表的id字段
查看外键关系名称
外键关系名称:在我们创建外键的时候,mysql帮我们自动生产一个外键名称
查看一个外键关系名称
show create table book(表名);
查看所有外键的名称
select REFERENCED_TABLE_SCHEMA,REFERENCED_TABLE_NAME,REFERENCED_COLUMN_NAME,table_name,CONSTRAINT_NAME from information_schema.key_column_usage;
- 删除外键关系
alter table book drop foreign key book_ibfk_1(外键名称);
- 删除字段
alter table publish drop id(字段名称);
- 添加字段
alter table publish add id(字段名称) int(数据类型) primary key auto_increment(约束条件);
- 创建外键时指定外键名称
外键名称不能直接修改只能先删除外键关系再添加来实现
创建表时:
create table t1(
id int,
pid int,
constraint fk_t1_publish foreign key(pid) references publish(id)
);
创建表完成之后
alter table book add constraint fk_t1_publish foreign key(pid) references publish(id);
外键的三种约束模式
约束模式和外键名称一样,只能先删除外键关系再进行添加
严格模式(默认的):district ,父表不能删除或者更新已经被子表数据引用的记录
级联模式:cascade,父表的操作,对应的子表关联的数据也跟着操作
创建表时,添加外键关系:
create table t1(
id int,
pid int,
foreign key(pid) references publish(id) on delete cascade on update cascade
); 创建表完成之后,添加外键关系
alter table book add foreign key(pid) references publish(id) on delete cascade on update cascade;
置空模式:set null,父表操作之后,子表对应的数据(外键字段)也跟着被置空
创建表时,添加外键关系:
create table t1(
id int,
pid int,
foreign key(pid) references publish(id) on delete set null on update set null
);
创建表完成之后,添加外键关系
alter table book add foreign key(pid) references publish(id) on delete set null on update set null;
注意
- 通常一个合理的约束模式是:删除的时候子表置空,更新的时候子表级联
- 指定模式的语法:foreign key(外键字段) references 父表(主键字段) on delete 模式 on update 模式;
- 删除置空的前提条件是 外键字段允许为空,不然外键会创建失败
- 外键虽然很强大,能够进行各种约束,但是外键的约束降低了数据的可控性和可扩展性。通常在实际开发时,很少使用外键来约束
修改表——单表查询
增加insert
insert into 表名 values(字段1,字段2.。。);
insert into 表名(id,name) values(字段1,字段2),(xx1,xx2); id,name,age(默认值)
插入查询结果:
insert into 表名(字段1,字段2,。。。)
select (字段1,字段2,。。。) from 表2 where ...;
将表2里面查询出来的结果插入到表1中,但是注意查询出来的数据要和我们表1的字段对应好
修改update
update 表名 set 字段1=值1,字段2=值2 where 条件;
update t2 set name='xxoo' where id = 1;
注意:不指定后面的where条件的话,会修改这个字段所有的数据
删除记录delete
delete from t3; 删除所有的数据,但是不会重置自增字段的数据号
delete from t3 where id = 1; 删除指定的数据,删除id字段数据为1的那一行记录
# 清空表
truncate 表名; 自增字段会重置
查询
# 四则运算:
select salary*12 from employee;
# 自定义显示格式 concat用法:
select concat('姓名:',name,'年薪:',salary*12) as Annual_salary from employee;
where 条件
# 比较运算符:> < >= <= <> !=
select name from employee where post='sale';
# between 的用法
select * from employee where id between 10 and 15;
id值在10到15之间——大于等于和小于等于的区间
# in的用法
select * from employee where id in(1,3,6);
等价于id = 1 or id = 3 or id = 6
# like的用法
pattern可以是 % 或者 _
% 表示任意多个字符
select * from employee where name like 'wu%';
_ 表示一个字符
select * from employee where name like 'al_'; 结果为空
select * from employee where name like 'al__'; 结果为alex
select * from employee where name like 'al___'; 结果为空
# 逻辑运算符:在多个条件下直接可以使用逻辑运算符 and or not
select * from employee id > 10 and name like 'al%';
select * from employee not id > 10; id小于或等于10的, not取反
分组group by
实例:
统计每个岗位的名称已经最高工资
select post,max(salary) from employee group by post;
分组时可以跟多个条件,那么现在是多个条件同时重复才算一组,group by 后面多条件用逗号隔开
select post,max(salsary) from employee group by post,id;
ONLY_FULL_GROUP_BY模式
set global sql_mode = 'ONLY_FULL_GROUP_BY';
如果设置了这个模式,那么select后面只能写group by后面的分组依据字段和聚合函数统计结果
分组再过滤having
select post,max(salary) from employee group by post having max(salary)>20000;
having过滤后面的条件可以使用聚合函数,where 不行
去重 distinct
实例:
select distinct post from employee;
注意问题:select的字段必须写在distinct的后面,并且如果写了多个字段,比如:select distinct post,id from employee; 这句话意思是post和id两个组合在一起同时重复的才算是重复数据
排序order by
实例:
升序
select * from employee order by age;
select * from employee order by age asc;
降序
select * from employee order by age desc;
多条件排序
按照age字段升序,age相同的数据,按照salary降序排序
select * from employee order by age asc,salary desc;
限制查询的记录数:LIMIT
实例:
取出工资最高的前三位
select * from employee order by salary desc limit 3;
默认初始位置为0,从第一条开始顺序取出三条
select * from employee order by salary desc limit 0,5;
从第0开始,即先查询出第一条,然后包含这一条在内往后查5条
select * from employee order by salary desc limit 5,5;
从第5开始,即先查询第6条,然后包含这一条在内往后查5条 (6,7,8,9,10)
使用正则表达式查询
#之前我们用like做模糊匹配,只有%和_,局限性比较强,所以我们说一个正则,之前我们是不是学过正则匹配,你之前学的正则表达式都可以用,正则是通用的
SELECT * FROM employee WHERE name REGEXP '^ale';
SELECT * FROM employee WHERE name REGEXP 'on$';
SELECT * FROM employee WHERE name REGEXP 'm{2}';
小结:对字符串匹配的方式
WHERE name = 'egon';
WHERE name LIKE 'yua%';
WHERE name REGEXP 'on$';
day42——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)的更多相关文章
- mysql创建外链失败1005错误解决方法
mysql创建外链失败1005错误解决方法 错误号:1005错误信息:Can't create table 'webDB.#sql-397_61df' (errno: 150)解决方法 错误原因有四: ...
- ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法
ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法 转载:http://blog.csdn.net/yao_qinwei/article/details/8761777 在插入模式下,按删 ...
- Linux使用退格键时出现^H ^?解决方法
Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...
- [转] linux下shell中使用上下键翻出历史命名时出现^[[A^[[A^[[A^[[B^[[B的问题解决,Linux使用退格键时出现^H解决方法
[From] https://www.zmrbk.com/post-2030.html https://blog.csdn.net/suifengshiyu/article/details/40952 ...
- python使用退格键时出现^H解决方法
Linux 使用退格键时出现^H解决方法 1.临时解决 按ctrl 2.永久解决 基本现象 进入 Python shell,按下 Delete/Backspace 键: Python 3.5.2 (d ...
- 在家赚钱,威客网站的使用方法 CSDN项目频道、SXSOFT、任务中国、猪八戒四个网站的线上交易 三种交易模式(1)悬赏模式(2)招标模式(3)直接交易模式
在家赚钱,威客网站的使用方法 很显然,<让猪八戒飞一会儿>作者对威客这一行业不熟悉,<让猪八戒飞一会儿>文章中错误有一些,不一一指出.我在CSDN项目频道.SXSOFT.任务中 ...
- (转)VMware虚拟机三种网络模式的区别及配置方法;
我的一点实际经验理解桥接和NAT 桥接是虚拟机完全作为一个独立的地址接在局域网中,NAT是虚拟机依赖宿主主机地址转换的一种方式 例子我的虚拟机如果用桥接模式,连接外部网站如百度时会提示此pc没有装公司 ...
- root的方法大体上有以下三种
root的方法大体上有以下三种一.手机软件安卓版直接root.这种方法不需要电脑的支持,也很安全.安卓版软件有:kingroot,360一键root,一键root大师,Towelroot,支持云roo ...
- Struts2中Action接收参数的方法主要有以下三种:
Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数(最原始的方式): a.定义:在Action类中定义属性,创建get和set方法: b.接 ...
随机推荐
- 《OKR工作法》——打造一支专一的团队
<OKR工作法>在最开始讲了这样一个故事,阿塔兰忒是斯巴达跑的最快的人,她的父亲为了将她嫁出去举办了一场跑步比赛并许诺冠军可以娶自己的女儿,阿塔兰忒为了不结婚决定参加比赛自己拿冠军.然而在 ...
- Windbg妙用
计算器 当你在调试,需要做一些从十六进制到十进制的简单转换,一些整数计算你不需要切换到calc.exe,你可以只使用windbg的表达式计算器.假设你得到了一个十六进制的大小,比如说2e903000, ...
- lettcode 上的几道哈希表与链表组合的数据结构题
目录 LRU缓存 LFU缓存 全O(1)的数据结构 lettcode 上的几道哈希表与链表组合的数据结构题 下面这几道题都要求在O(1)时间内完成每种操作. LRU缓存 LRU是Least Recen ...
- 【luoguP4544】[USACO10NOV]购买饲料Buying Feed
题目链接 首先把商店按坐标排序 \(dp_{i,j}\)表示前i个商店买了j吨饲料并运到终点的花费,二进制拆分优化转移 #include<algorithm> #include<io ...
- 二分法python实现
聚会游戏,一个人想一个数,其他人来猜,然后告诉你猜大了还是小了,直到猜到这个数. 二分法和猜数游戏类似,只不过猜的时候一定猜最中间的那个数,折半查找所需内容,就数组来说,数组越长,梯度下降越快,二分查 ...
- 设置多个className
有时候我们需要有选择地设置多个className function myComponent(props) { const myClassName = { 'aaa', {'bbb': props.ne ...
- vue使用axios发送请求,都会发送两次请求
vue 使用axios,每次的请求都会发送两次,第一次的请求头为options CORS是一个W3C标准,全称是"跨域资源共享"(Cross-origin resource sha ...
- ranger整合kerberos
一.生成主体 在kerberos服务器生成用于ranger的用户主体: # kadmin.local addprinc -randkey HTTP/manager1@HADOOP.COM addpri ...
- Tomcat启动时,控制台和IDEA控制台中文乱码解决方案
Tomcat启动时 控制台中文乱码 cmd控制台 IDEA控制台 解决方案 cmd乱码 打开Tomcat目录下的apache-tomcat-8.5.47\conf\logging.properties ...
- 解决iis内存占用过大的问题--ZT
解决iis内存占用过大的问题 在IIS6下,经常出现w3wp的内存占用不能及时释放,从而导致服务器响应速度很慢. 今天研究了一下,可以做以下配置: 1.在IIS中对每个网站进行单独的应用程序池配置.即 ...