sql中如何实现级联表的操作

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了sql中如何实现级联表的操作相关的知识,希望对你有一定的参考价值。

首先建议尽量避免使用自动级联操作,尤其是更新。这在以后开发中会出很多问题的。
两种方法:
1.把两个表需要关联的字段,设置主外键关联,然后设置它们级联更新和删除就行了;
2.就是给一个表建立触发器,当插入或更新的时候,自动更新另一个表。
试试吧!GOOD LUCK!
参考技术A 给一个表建立触发器,当插入或更新的时候,自动更新另一个表 参考技术B 我的笔记:
1.自然联结
Natural Join、Using和On关键字创建的联结都叫自然联结。
使用Natural Join联结时,前提条件是源表和目标表有相同名称且数据类型一致的列,这种联结叫纯自然联结。
当源表和目标表,存在多个相同名称的列时,我们仅希望使用其中某一个或几个,并非使用全部相同列进行联结时,使用Using进行限制。Natural和Using是互斥的存在。
当源表和目标表,并不存在名称相同的列,但列的实际数据有等值或者不等值关系时,使用On显式的进行关系陈述。这种形式,也是最通用,最节省性能的方式。
on 举例:
select
e.employee_id,
e.department_id,
d.department_name,
d.location_id,
l.city
from employees e
join departments d
on(e.department_id=d.department_id)
join locations l
on(d.location_id=l.location_id);
老版本 举例:
select
department_id,
departments.location_id,
city
from departments,locations
where departments.LOCATION_ID = locations.LOCATION_ID;
2.自联结
select
worker.last_name,
worker.manager_id,
manager.last_name,
manager.employee_id
from employees worker
join employees manager
on(worker.manager_id = manager.employee_id);
3.非等值联结(外联结)
内联结:
数据可以进行一一匹配的(以上都是内联结)
外联结:
除了一一匹配的,还可以把不匹配的展示出来
左外联结 已左边表为主,右边表不匹配的补null
left outer join
右外联结 已右边表为主,左边表不匹配的补null
right out join
全外联结 以两边表为主,两边表不匹配的都补null
full out join
举例:
--左外联结
select
e.last_name,
e.department_id,
d.department_name
from employees e
left outer join departments d
on(e.department_id = d.department_id);
--右外联结
select
e.last_name,
d.department_id,
d.department_name
from employees e
right outer join departments d
on(e.department_id = d.department_id);
--全外联结
select
e.last_name,
d.department_id,
d.department_name
from employees e
full outer join departments d
on(e.department_id = d.department_id);
--左外 传统写法
select
last_name,
e.department_id,
d.department_name
from employees e,departments d
where e.DEPARTMENT_ID = d.DEPARTMENT_ID(+);

MySQL联表查询的索引使用

参考技术A 一共3张表 knowledge , knowledge_question , knowledge_answer ,数据在 6000~10000 之间。

执行的语句:

执行时间约 10分钟 ,查看执行计划如下:

全部都是全表扫描,根据MySQL联表查询的算法 Nested-Loop Join ,MySQL查询的结果集是3张表的笛卡尔积,所以效率特别低。

耗时变成 20毫秒

给Where条件建立索引,并不一定会使用。
比如:在表 knowledge 的字段 update 上建立索引 idx_time :

结果执行上来看,并没有使用索引 idx_time 。

如果where条件从 k.update_time>'2019-01-03 12:00:00' 修改为 k.update_time='2019-01-03 12:00:00' (从 > 变成 = )

则会使用索引 idx_time

在建立索引的时候,会遇到 Table Metadata Lock 的问题,可以先 show processlist ,找到占用表锁的连接,然后 kill 。

以上是关于sql中如何实现级联表的操作的主要内容,如果未能解决你的问题,请参考以下文章

使用postgre数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例

ORACLE数据库 存储过程 中 从几张级联表中查询 出结果集,循环添加到另一张表的某一字段

hibernate删除操作,一般如何实现

级联在sql中是如何实现的?

Join 实现 2 表数据联动

salesforce零基础学习(七十一)级联表DML操作