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数据库实现树形结构表的子-父级迭代查询,通过级联菜单简单举例