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——外键的限制和解决方法、外键的三种约束模式、修改表(单表查询)的更多相关文章

  1. mysql创建外链失败1005错误解决方法

    mysql创建外链失败1005错误解决方法 错误号:1005错误信息:Can't create table 'webDB.#sql-397_61df' (errno: 150)解决方法 错误原因有四: ...

  2. ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法

    ubuntu下使用vi是方向键变乱码 退格键不能使用的解决方法 转载:http://blog.csdn.net/yao_qinwei/article/details/8761777 在插入模式下,按删 ...

  3. Linux使用退格键时出现^H ^?解决方法

    Linux使用退格键时出现^H ^?解决方法 在linux下执行脚本不注意输错内容需要删除时总是出现^H ^H不是H键的意思,是backspace.主要是当你的终端backspace有问题的时候才需要 ...

  4. [转] 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 ...

  5. python使用退格键时出现^H解决方法

    Linux 使用退格键时出现^H解决方法 1.临时解决 按ctrl 2.永久解决 基本现象 进入 Python shell,按下 Delete/Backspace 键: Python 3.5.2 (d ...

  6. 在家赚钱,威客网站的使用方法 CSDN项目频道、SXSOFT、任务中国、猪八戒四个网站的线上交易 三种交易模式(1)悬赏模式(2)招标模式(3)直接交易模式

    在家赚钱,威客网站的使用方法 很显然,<让猪八戒飞一会儿>作者对威客这一行业不熟悉,<让猪八戒飞一会儿>文章中错误有一些,不一一指出.我在CSDN项目频道.SXSOFT.任务中 ...

  7. (转)VMware虚拟机三种网络模式的区别及配置方法;

    我的一点实际经验理解桥接和NAT 桥接是虚拟机完全作为一个独立的地址接在局域网中,NAT是虚拟机依赖宿主主机地址转换的一种方式 例子我的虚拟机如果用桥接模式,连接外部网站如百度时会提示此pc没有装公司 ...

  8. root的方法大体上有以下三种

    root的方法大体上有以下三种一.手机软件安卓版直接root.这种方法不需要电脑的支持,也很安全.安卓版软件有:kingroot,360一键root,一键root大师,Towelroot,支持云roo ...

  9. Struts2中Action接收参数的方法主要有以下三种:

    Struts2中Action接收参数的方法主要有以下三种: 1.使用Action的属性接收参数(最原始的方式):     a.定义:在Action类中定义属性,创建get和set方法:     b.接 ...

随机推荐

  1. 利用window.open如何绕过浏览器拦截机制

    在浏览器的安全机制里,非用户触发的window.open方法是会被拦截的,例如: var btn = $('#btn'); btn.click(function () { // 算做用户触发,所以不会 ...

  2. Xilinx ISE中使用Synplify综合报错的原因

    在Xilinx ISE中使用Synopsys Synplify 综合比较方便,但有时会出现如下错误: "ERROR:NgdBuild: - logical block ' ' with ty ...

  3. mysql帐号,权限管理

    -> use mysql; //选择数据库 -> select host,user,password from user; //查询已有用户 -> insert into user ...

  4. PL/SQL Developer插入数据到数据库出现数据中文乱码

    问题描述: 使用PL/SQL Developer往Oracle数据库插入数据,出现中文乱码! 解决办法: 1.执行脚本 select userenv('language') from dual; 结果 ...

  5. 第06组 Beta冲刺(5/5)

    队名:拾光组 组长博客链接 作业博客链接 团队项目情况 燃尽图(组内共享) 组长:宋奕 过去两天完成了哪些任务 继续维护后端代码 准备beta版本的答辩 GitHub签入记录 接下来的计划 整理任务, ...

  6. 单细胞数据整合方法 | Comprehensive Integration of Single-Cell Data

    操作代码:https://satijalab.org/seurat/ 依赖的算法 CCA CANONICAL CORRELATION ANALYSIS | R DATA ANALYSIS EXAMPL ...

  7. android -------- GifImageView 之gif图片加载

    目前支持Gif播放的开源库还是有的,试了一下还是这种好用点,所以来分享下android-gif-drawable是通过JNI来渲染帧的,这种方式比使用WebView或者Movie效率要高 要求Andr ...

  8. git clone速度太慢的解决办法(亲测还有效)

    https://www.linuxidc.com/Linux/2019-05/158461.htm 1.查找域名对应的ip地址,并修改hosts文件 linuxidc@linuxidc:~/linux ...

  9. ubuntu18.04 无法连接有线

    突然发现Ubuntu无法连接有线,插上网线后还是显示 Cable unplugged. 参考这篇文章:https://zhuanlan.zhihu.com/p/32924819 因为我无线网卡正常工作 ...

  10. Qt编写安防视频监控系统14-本地回放

    一.前言 在上一篇文章将视频文件存储好了,需要提供界面方便用户查询视频文件进行回放,其实这个回放就是播放历史存储的视频文件,并不是什么高大上的东西,视频回放在这个系统中分三种,第一种是本地回放,回放存 ...