mysql 定义外键并增删改查_20150102--Mysql外键+增删改查-02

外键

外键:外面的键,前表中的某个字段与另外的表中的字段(主键)有一个对应的关系

外键关键字:foreign key,也是一种索引。

创建外键

外键和主键有点类似,但是不一样。

dfa95b0af7b6b331b2b385200dc5d2ca.gif

1. 8bb6a485aeae889837ecd2f5417204d6.gif在所有的字段之后,指定对应的外键。

foreign key(字段名) references 表名(字段)

28bf3645d929cbff048ae4babcb7e44f.gifc02d7063473c37cd83d374bbd375f70f.gif1e7f7f422831ca5722e83e316a5c0e47.png

外键约束

外键的作用是用来维护两张表之间的关系,关系是用来限制表操作的。

父表(主表):被外键指向的表叫做主表

子表(从表):存在外键字段的表叫子表

1. 限制子表数据的插入:子表中的外键字段的值必须事先已经在父表中存在

a6eff61c8fea56b5a66a8b2dd0eb165c.png

2. 限制父表对数据进行操作:更新和删除,限制指的是对应主键的修改。

44d57ce8512119d63c5e69d8f64d26a5.png

修改外键:外键不能被直接修改,应当先删除后新增

删除外键

alter table 表名 drop foreign key 外键名;

8eab916bcc55dfa4e32302440352c88b.png

9df0a8ec271c3c2a3d0bfa6a133c8996.gif新增外键

cecd6ec5a2aed860619b886a491eb77f.gif修改表结构

alter table 表名 add constraint 外键名 foreign key(字段) references 表名(字段);

f0a198ba6c6426a0d00d124eb07b1073.png

约束模式

用户可以根据自身的需求对外键采用不同的约束方式

有三种约束模式

严格模式:restrict,严格约束外键对应的表

置空模式:set null,将一个外键对应的字段数据给变成null,当父表数据改变的时候,子表的数据被设置成null

级联模式:cascade,级联操作,当父表数据被改变的时候,子表跟着改变

语法

foreign key(字段) references 表(字段) on delete 约束模式 on upldate 约束模式

通常的约束模式:on update cascade on delete set null

35863db682e4ca29c14fa08221f7f6c8.png

更新父表

15ed2470cab78326243781c980369107.png

删除父表数据

c5eff289024f82a226760f1c8dbf243d.png

外键条件

1.外键表和被引用的表(父子表)都应该是InnoDB的存储引擎

2. 外键字段和被引用的主键字段,必须数据类型完全一致

3. 外键的名字必须具有唯一性

4. 外键可以在一张表中创建多个

5. 如果要使用约束模式:置空模式,必须保证子表对应的外键字段本身允许为空

8b2f11598697a3c9e704ce1c6ef5a5ff.png

高级数据操作

新增数据

标准语法

insert into 表名 (字段列表) values(值列表);

蠕虫复制

从一个已有的数据中获取数据,然后将数据插入到对应数据表中。

insert into 表名 (字段列表) select 字段列表 from 表名;

668ac215daee0a1d4727bdf36951a018.png

蠕虫复制的作用

1. 短时间内迅速增加表中的数据(意义不大),测试数据表的压力

2. 从表中去复制数据

a) 复制表结构:create table 表名 like 已经存在的表;

483ef52401a420af604aa85a859e741e.png

b) 蠕虫复制数据

270e650bc7fbd10f205d898f1390c65c.png

主键冲突

主键冲突指的是当数据进行插入操作的时候,如果主键冲突了该怎么办。

解决方案1:如果主键冲突,执行更新操作,没有冲突直接插入

insert into 表名 values (值列表) on duplicate key update 字段 = 值[,字段 = 值]

e4eda42163b683fe47ffe59620be937a.png

解决方案2:如果主键冲突,先删除,后新增

replace into 表名 values(值列表);

2b5293c2f63fabbc9a3f5c9e223692dd.png

删除数据

标准语法

delete from 表名 where条件;

高级语法

delete from 表名 where条件 [order by排序] [limit 数值]; -- 排序后删除指定条数数据

41ed4c93c2c3a888179300def3f7e914.png

truncate语法:清空表包括对应的自动增长:先删除表,后新增表

4f53f64e3f6d2b8379082cd4d412e904.png

更新数据

与高级的删除数据一样:利用排序和限制

update 表名 set 字段 =值 where条件 order by字段 limit 数值;

查询数据

标准语法

select 字段列表/* from 表名 where条件;

完整语法

select 选择模式 表达式[字段列表(别名)/*] [from 子句] [where子句] [group by子句] [having子句] [order by子句] [limit子句]

选择模式

选择模式指的是当select查到数据之后,对数据的处理方式:查询全部(默认的all),去重(去掉重复的:记录重复,distinct)

267ac4dd7ac85dc0c04383ccad5928de.gifac5dc39d686cf9dfe6c71b953c207aec.gif9ae5b1dbc3ab216f3d3981d6a00f9e33.png

表达式

select指定的要返回数据形式

通常要查询的数据,都是字段列表或者*(全部字段),有时候会因为同时查询多个表而出现字段重名的问题。需要使用字段别名来决绝问题。

语法:字段 [as] 别名

c1ac969932219e59960d11e4849cdb8e.png

别名不能真正改变字段名。

from子句

from子句指 的是数据源

from后面必须接数据源,数据源不一定是一张表

1. from后面可以跟多张表,使用逗号分隔

b50ce560f27657e77c552f4ad1dc7648.png

笛卡尔积没有意义:应当尽量避免。

2. 表别名

7e9333d98674be0990d224dd0005bd79.png

3. 数据源不一定是一张已经存在的表,需要的只是一个二维表的结构。from后面可以跟一个子查询。

2b2043fc8d009ca081430e826a56490d.png

4. 虚拟表

一个不存在的表:dual,凡是没有数据源的select语句都可以为了保证语法的完整性,而增加from子句,数据源是dual

923d6b517de849ccd517a925c1af4257.png

where子句

where子句用于筛选条件,对数据(记录)进行逐行判断,返回是一个类似布尔的结果。

d185c9ffc024cba4f47f5bd7df9db5b1.png

where原理

3230aacf9680d8a4b8161f3328ba2efc.png

只有where操作的时候,是直接在磁盘上对数据进行判断,where之后的所有子句都是对内存中的数据进行操作

补充知识

mysql中没有布尔类型,但是却“支持”布尔类型,是内部会进行数据转换,识别关键字

f04407883ec8c8220130f3436c541de9.png

where判断:返回的结果是布尔类型

比较运算:=,>,>=,

51d7ad6d8ac29009e3486c2a746fd94d.png

逻辑运算:&&and和||or,用于多条件联合判断

模糊匹配:like ‘patter’,匹配符:%和_

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值