目录

外键的使用和必要性

join的使用区分(natural,cross,inner,outer)

外键的使用和必要性

1. 外键字段和主键字段的名称可以不同,但是类型应该一致。

2. 外键的必要性:

  1. 不用外键约束,也可以进行关联查询,但是有了它,MySQL 系统才会保护你的数据,避免出现误删的情况,从而提高系统整体的可靠性。
  2. 为什么在 MySQL 里,没有外键约束也可以进行关联查询呢?
  1. 原因是外键约束是有成本的,需要消耗系统资源。对于大并发的 SQL 操作,有可能会不适合。比如大型网站的中央数据库,可能会因为外键约束的系统开销而变得非常慢。所以,MySQL 允许你不使用系统自带的外键约束,而是在应用层面完成检查数据一致性的逻辑。也就是说,即使你不用外键约束,也要想办法通过应用层面的附加逻辑,来实现外键约束的功能,确保数据的一致性。
  2. 外键与级联更新适用于单机低并发,不适合分布式、高并发集群;级联更新是强阻塞,存在数据库更新风暴的风险;外键影响数据库的插入速度。
  3. “外键约束,可以简单有效的保证数据的可靠性。适合内部管理系统使用,因为访问量不会太大。如果是面向外界用户使用的应用,外键所带来的性能损耗,可能无法支撑大批用户的同时访问。但是,数据的可靠性和唯一性才是最重要的,在保证一次对多张表操作的过程中,可以使用事务来确保操作的一致性。”===》作者回复: 在系统开销和使用的功能之间需要做好平衡,既要确保数据可靠性和唯一性,又要确保系统可用.
  1. 如果你的业务场景因高并发等原因,不能使用外键约束,在这种情况下,你怎么在应用层面确保数据的一致性呢?
    》应用层面实现外键约束的功能,指的就是在应用里面加上检查。比如删除主表中记录的时候,需要检查从表中是否有记录引用到主表中的这条记录,有的话就不能删除,否则可以删除。各种不同的框架有自己的特点,要根据实际情况决定如何处理。

join的使用区分(natural,cross,inner,outer)

  1. natural join,cross join,inner join,outer join(left ,right)区别示例

                                                                t1

java外键 外键 join_边缘计算

                                                                t2

java外键 外键 join_java外键_02

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

采用自然连接的相同列合并成一列

java外键 外键 join_java外键_03

CROSS JOIN(创建笛卡尔积)

对两张表通过交叉联合产生第三张返回结果集的表。相当于普通的连接。如下返回6行=2*3

测试:select * from t1 cross join t2;

java外键 外键 join_python_04

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

java外键 外键 join_java外键_05

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)

java外键 外键 join_边缘计算_06

RIGHT OUTER JOIN(右连接) = right join

测试:select * from t1 right outer join t2 on (t1.id=t2.id)

结果:

java外键 外键 join_python_07

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要通过另外的方式实现)。

java外键 外键 join_云计算_08