1. 什么是外键:外键是指援用另一个表中的一列或多列,被援用的列应具有主键束缚或唯一性束缚。外键用于竖立和增强两个表数据之间的衔接。
Student表中的gid是门生地点班级id,是引入了grade表中的主键id。那末gid就能够作为表student的外键。被援用的表,即表grade是主表;援用外键的表,即表student是从表,两个表是主从关联。表student用gid能够衔接表grade中的信息,从而竖立了两个表数据之间的衔接。
惹人外键后,外键列只能插进去参照列存在的值,参照列被参照的值不能被删除,这就保证了数据的参照完整性。
2. 为表增加外键束缚
想要真正衔接两个表的数据,就须要为表增加外键束缚。为表增加外键束缚的语法花样以下:alter table 表名 add constraint FK_ID foreign key(外键字段名) references 外键表名(主键字段名)
在为表增加外键束缚时,有些须要注重的处所,以下所示:
(1) 竖立外键的表必需是InnoDB型,不能是暂时表。因为在MySQL中只需InnoDB范例的表才支撑外键;
(2) 定义外键名时,不能加引号,如constraint ‘FK_ID’或constraint “FK_ID”都是毛病的。
在主表中数据被删除时,从表的数据也应被删除,否则会参数许多无意义的垃圾数据。Mysql能够在竖立外键时增加on delete或on update子句来通知数据库,如何防止垃圾数据的发生。细致语法花样以下:
Alter table 表名 addconstraint FK_ID foreign key(外键字段名)references外表表名(主键字段名);
[on delete{cascade | set null | no action | restrict}]
[on update{cascade | set null | no action | restrict}]
语句中各参数的细致申明以下表所示:
参数称号 |
功用形貌 |
Cascade |
删除包含与已删除键值有参照关联的一切纪录 |
Set null |
修正包含与已删除键值有参照关联的一切纪录,运用null值替代(不能用于已标记为not null的字段) |
No action |
不举行任何操纵 |
Restrict |
谢绝主表删除或修正外键关联列。(在不定义on delete和on update子句时,这是默认设置,也是最平安的设置) |
3. 删除外键束缚: alter table 表名 drop foreign key 外键名;
二、 操纵关联表
1. 关联关联
(1) 多对一:在多对一的表关联中,应当将外键建在多的一方,否则会形成数据的冗余。
(2) 多对多:如门生表和课程表。一般情况下,为了完成这类关联须要定义一张中心表(称为衔接表),该表会存在两个外键,离别参照课程表和门生表。在多对多的关联中,需注重的是,衔接表的两个外键都是可反复的,然则两个外键之间的关联是不能反复的,所以这两个外键又是表的团结主键。
(3) 一对一:首先要分清主从关联,从表须要主表的存在才有意义,如工资主表,身份证为从表,外键竖立在从表。需注重的时,这类关联在数据库中并不罕见,因为以这类体式格局存储的信息一般会放在一个表中。在现实开辟中,一对一关联关联能够应用于以下几个方面。
Ø 支解具有许多列的表;
Ø 因为平安原因而断绝表的一部分;
Ø 保留暂时的数据,而且能够毫不费力地经由过程删除该表而删除这些数据。
2. 增加数据
上述语句实行胜利后,两个表之间的数据就具有关联性。假如要查询软件一班有哪些门生,首先要查询软件一班的id,然后依据这个id在student表中查询该班级有哪些门生。
3. 删除数据:因为grade表和student表之间具有关联关联,参照列被参照的值是不能被删除的。因而,在删除软件一班时,一定要先删除该班级的一切门生,然后再删除班级。
(1) 将软件一班的一切门生删除
(2) 在grade表中,将软件一班删除
若直接删除软件二班会失足:
需注重的是,现实情况中,想要删除’软件一班’并不须要删除’软件一班的门生’,能够将表student中gid=1处所改成gid为null只需主表中该列没有被从表参照就能够删除。然则在建表时,gid字段有非空束缚,所以这个例子中只能删除门生。
三、 衔接查询:当两个或多个表中存在雷同意义的字段时,便能够经由过程这些字段对差别的表举行衔接查询。
1. 交织衔接:返回的效果是被衔接的两个表中一切数据行的笛卡儿积,也就是返回第一个表中相符查询前提的数据行数乘以第二个表中相符查询前提的数据行数。语法花样以下:
Select * from 表1 cross join 表2;
从上面的效果能够看出,交织衔接的效果就是两个表中一切数据的组合,须要注重的是,在现实研发中,这类需求是很少见的,平常不会运用,而是运用细致的前提对数据举行有目标的查询。
2. 内衔接:又称简朴衔接或天然衔接。运用比较运算符对两个表的数据举行比较,并列出与衔接前提婚配的数据行,组合成新的纪录。语法花样以下:
Select 查询字段 from 表1 [inner] join 表2 on 表1.关联字段=表2.关联字段
还能够运用where前提语句来完成一样的功用。
虽然这两种体式格局的查询效果是一样的,然则inner join是内衔接语句,where是前提推断语句,在where背面能够直接增加其他前提,而inner join语句不能够。
#假如在一个衔接查询中,触及两个表是同一个表,这类查询称为自衔接查询。自衔接是一种特别的衔接,它是指相互衔接的表在物理上为同一个表,但逻辑上分为两个表,比方要查询王红地点部门有哪些员工,就能够运用自衔接查询。
3. 外衔接:症结字左侧的表被称为坐标,右侧的字被称为右表
Select 所查字段 from 表1 left|right [outer] join 表2
On 表1.关联字段=表2.关联字段 where前提
(1) left join(左衔接):返回包含左表中的一切纪录和右表中相符衔接前提的纪录。
假如左表的某条纪录在右表中不存在,则在右表中显现为空。
(2) Right join(右衔接):返回包含右表中的一切纪录和左表中相符衔接前提的纪录。
4. 复合前提衔接查询
四、 子查询:是指一个查询语句嵌套在另一个查询语句内部的查询。它能够嵌套在一个select、select … into语句、insert…into等语句中。在实行查询语句时,首先会实行子查询中的语句,然后将返回效果作为外层查询的过滤前提,在子查询中一般能够运用in、exists、any、all操纵符
(1) 带in症结字的子查询:内层查询语句仅返回一个数据列,这个数据列中的值将供外层查询语句举行比较操纵。
比方:查询存在岁数为20岁的员工部门。
(2) 带exists症结字的子查询:exists症结字背面的参数能够是恣意一个子查询,这个子查询的作用相当于测试,它不会发生任何数据,只返回True或False,当返回值为True时,外层查询才会实行。
下例中,子查询的返回效果为True,所以外层查询语句会实行,即查询出一切部门信息。须要注重的是,exists症结字比in症结字的运转效率高,所以在现实开辟中,特别是大数据量时,引荐运用exists症结字。
(3) 带any症结字的子查询:any示意满足个中恣意一个前提,它许可建立一个表达式对子查询的返回值列表举行比较,只需满足内层子查询中的恣意一个比较前提,就返回一个效果作为外层查询前提。
(4) 带all症结字的子查询:和any有些相似,只不过带all症结字的子查询返回的效果需同时满足一切内层查询前提。
(5) 带比较运算符的子查询
本文讲解了MySQL数据库多表操纵 ,更多相干内容请关注ki4网。
相干引荐:
$选择器--是如何将DOM封装成jquery对象
原生js组件化开辟简朴轮播图实例代码
css3动画导航栏3D
以上就是MySQL数据库多表操纵的细致内容,更多请关注ki4网别的相干文章!