目录
外键的使用和必要性
join的使用区分(natural,cross,inner,outer)
外键的使用和必要性
1. 外键字段和主键字段的名称可以不同,但是类型应该一致。
2. 外键的必要性:
- 不用外键约束,也可以进行关联查询,但是有了它,MySQL 系统才会保护你的数据,避免出现误删的情况,从而提高系统整体的可靠性。
- 为什么在 MySQL 里,没有外键约束也可以进行关联查询呢?
- 原因是外键约束是有成本的,需要消耗系统资源。对于大并发的 SQL 操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢。所以,MySQL 允许你不使用系统自带的外键约束,而是在应用层面完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。
- 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
- “外键约束,可以简单有效的保证数据的可靠性。适合内部管理系统使用,因为访问量不会太大。如果是面向外界用户使用的应用,外键所带来的性能损耗,可能无法支撑大批用户的同时访问。但是,数据的可靠性和唯一性才是最重要的,在保证一次对多张表操作的过程中,可以使用事务来确保操作的一致性。”===》作者回复: 在系统开销和使用的功能之间需要做好平衡,既要确保数据可靠性和唯一性,又要确保系统可用.
- 如果你的业务场景因高并发等原因,不能使用外键约束,在这种情况下,你怎么在应用层面确保数据的一致性呢?
》应用层面实现外键约束的功能,指的就是在应用里面加上检查。比如删除主表中记录的时候,需要检查从表中是否有记录引用到主表中的这条记录,有的话就不能删除,否则可以删除。各种不同的框架有自己的特点,要根据实际情况决定如何处理。
join的使用区分(natural,cross,inner,outer)
- natural join,cross join,inner join,outer join(left ,right)区别示例
t1
t2
NATURAL JOIN(自然连接)
两张表通过NATURAL JOIN连接的时候,相当于有个隐含的WHERE子句,对两张表中同名的对应列相比较看是否相等。
测试:SELECT * FROM t1 NATURAL JOIN t2
相当于:select * from t1, t2 where t1.id = t2.id and t1.field01 = t2.field01
采用自然连接的相同列合并成一列
CROSS JOIN(创建笛卡尔积)
对两张表通过交叉联合产生第三张返回结果集的表。相当于普通的连接。如下返回6行=2*3
测试:select * from t1 cross join t2;
INNER JOIN(内连接)
内连接就相当于普通的CROSS JOIN,
只是格式不一样,INNER JOIN在后面有一个ON子句(相当于WHERE)的搜索条件,用于过滤返回的行。
测试:select * from t1 inner join t2;
结果:与cross一样测试:SELECT * FROM t1 INNER JOIN t2 WHERE t1.id = t2.id
等价于:SELECT * FROM t1 , t2 WHERE t1.id = t2.id
OUTER JOIN (外连接)
select * from t1 outer join t2 on (t1.id=t2.id)
outer join告诉DBMS生成结果表,在此表中不仅带有相关(t1.id=t1.id)行对,而且还有来自两个源表中任一表的不匹配的行。就是说没匹配到的也要显示出来,这里有
LEFT OUTER JOIN(左连接)= LEFT JOIN
测试:select * from t1 left outer join t2 on (t1.id=t2.id)
RIGHT OUTER JOIN(右连接) = right join
测试:select * from t1 right outer join t2 on (t1.id=t2.id)
结果:
FULL OUTER JOIN(全连接),Oracel测试,Mysql不支持;= full join
FULL OUTER JOIN 返回组合了LEFT OUTER JOIN 和RIGHT OUTER JOIN结果的表
测试:select * from t1 full join t2 on (t1.id=t2.id);
结果:
- left outer join、
- right outer join、
- full outer join(mysql要通过另外的方式实现)。