MySQL 多表关联更新及删除
目录:
一、 多表关联更新
问题描述:现有tdb_goods表(含有具体信息)和tdb_goods_cates表(没有具体信息),需要查询tdb_goods表的所有记录,并且按"类别"分组,且将分组结果写入到tdb_goods_cates数据表。然后通过tdb_goods_cates数据表来更新tdb_goods表
² 查询tdb_goods表的所有记录,并且按"类别"分组
SELECT goods_cate FROM tdb_goods GROUP BYgoods_cate;
² 将分组结果写入到tdb_goods_cates数据表
INSERT tdb_goods_cates (cate_name) SELECTgoods_cate FROM tdb_goods GROUP BY goods_cate;
² 通过tdb_goods_cates数据表来更新tdb_goods表
UPDATE tdb_goods INNER JOIN tdb_goods_catesON goods_cate = cate_name
SET goods_cate = cate_id ;
二、 多表关联删除
² 从MySQL数据表t1中把那些id值在数据表t2里有匹配的记录全删除掉
DELETE t1 FROM t1,t2 WHERE t1.id=t2.id 或DELETE FROM t1 USING t1,t2 WHERE t1.id=t2.id
² 从MySQL数据表t1里在数据表t2里没有匹配的记录查找出来并删除掉
DELETE t1 FROM t1 LEFT JOIN T2 ON t1.id=t2.idWHERE t2.id IS NULL 或
DELETE FROM t1,USING t1 LEFT JOIN T2 ONt1.id=t2.id WHERE t2.id IS NULL
² 从两个表中找出相同记录的数据并把两个表中的数据都删除掉
DELETE t1,t2 from t1 LEFT JOIN t2 ONt1.id=t2.id WHERE t1.id=25(注意此处的delete t1,t2 from 中的t1,t2不能是别名)
如:delete t1,t2 from table_name as t1left join table2_name as t2 on t1.id=t2.id where table_name.id=25 在数据里面执行是错误的(MySQL 版本不小于5.0在5.0中是可以的)
上述语句改写成
delete table_name,table2_name fromtable_name as t1 left join table2_name as t2 on t1.id=t2.id wheretable_name.id=25 在数据里面执行是错误的(MySQL 版本小于5.0在5.0中是可以的)
² 两张表关联删除:
DELETE a,b FROM table1 a INNER JOIN table2 b ON a.id = b.aid WHERE a.id = '1'或DELETE a,b FROM table1a,table2 b WHERE a.id = b.aid AND a.id = '1'
² 三张表删除:
DELETE a,b,c FROM table1 a INNER JOIN table2 b ON a.id = b.aid
INNER JOIN table3 c ON a.id = c.aid WHERE a.id = '1'
不过这样有一个问题,就是如果a表里数据,而b表或者c表里没数据,那么整个删除就失败,即删除0条数据
如果你的主表一定有数据,而关联的表有可能有数据也有可能没数据的话,我们可以通过左连接删除的方式,把两张表都删除。无论关联的表有没有数据,主表都可以删除成功
DELETE a ,b ,c FROM table1 a LEFT JOIN table2 b ONa.id = b.aid
LEFT JOIN table3 c ON a.id = c.aid WHERE a.id = 1
Unknown table 'a' in MULTI DELETE的解决办法
在临时表中的关联删除出现错误“Unknown table 'a' in MULTI DELETE的解决办法”
在存储过程中,调用:
出现题目中的错误,原因如下:
在mysql中多表联合删除时,表别名只能在sql中表关联部分声明。我们应该避免不是表关联部分声明别名,因为这产生歧义的sql,从而产生不是期望的结果,例如在错误的表中删除行,举个例子来说:
对于多个表的删除,表的列表中提到的表别名的引用,使用默认数据库,除非已经明确地指定了一个数据库。例如,如果默认数据库是db1,下面的语句将不会工作,因为不确定的别名a2被认为已经有了db1:
WHERE a1.id=a2.id;
除了默认数据库外,为了正确地匹配表的别名,我们必须明确地指定正确的数据库的名字,
WHERE a1.id=a2.id;
根据上述理论,我的sql应该这样写:
还有需要注意的是:
1.如果你为一个表声明了别名,当你指向这个表的时候,就必须使用这个别名,例如:
DELETE t1 FROM test AS t1, test2 WHERE ...
-- 错误的写法:
DELETE test FROM test AS t1, test2 WHERE ...
2.在多个表联合删除时,不能使用order by 或limit,而单个表的删除时就没有这个限制。
3.当前,我们还不能在删除表的时候,在子查询中select from相同的表。
MySQL 多表关联更新及删除的更多相关文章
- MySQL多表关联数据同时删除
MySQL多表关联时的多表删除: DELETE t1, t2FROM t1LEFT JOIN t2 ON t1.id = t2.idWHERE t1.id = 25
- mysql多表关联更新
update 表A inner join 表B on 表A.关联字段 = 表B.关联字段 set 表a.待更新字段01 = 表B.字段01 , 表a.待更新字段021 = 表B.字段02 where ...
- Mysql多表联合更新、删除
UPDATE snyts_user u INNER JOIN snyts_order o ON u.user_id = o.user_id INNER JOIN snyts_refund_order ...
- 数据库MySQL中关于“多表关联更新”的那些事
在常见的sql中,我们经常在查询中进行多表关联查询,用的比较熟练.今天在开发中遇到一个实际业务场景是多表关联更新,一时不知所措.本着多学习的态度,没有直接写java代码去实现,终于把多表关联更新的sq ...
- Oracle\MS SQL Server Update多表关联更新
原文:Oracle\MS SQL Server Update多表关联更新 一条Update更新语句是不能更新多张表的,除非使用触发器隐含更新.而表的更新操作中,在很多情况下需要在表达式中引用要更新的表 ...
- MySql多表关联,根据某列取前N条记录问题
近来遇到一个问题:“MySql多表关联,根据某列取前N条记录”. 刚开始一直在想,SQL语句是否可以做到直接查询出来,但几经折磨,还是没能写出SQL语句,-------如果有大牛的话,望指点迷津.我把 ...
- MySQL快速回顾:更新和删除操作
前提要述:参考书籍<MySQL必知必会> 6.1 更新数据 为了更新(修改)表中的数据,可使用UPDATE语句.可采用两种方式使用UPDATE: 更新表中特定的行: 更新表中所有的行. U ...
- mysql多表关联update
日常的开发中一般都是写的单表update语句,很少写多表关联的update. 不同于SQL Server,在MySQL中,update的多表连接更新和select的多表连接查询在使用的方法上存在一些小 ...
- [MySQL]多表关联查询技巧
示例表A: author_id author_name 1 Kimmy 2 Abel 3 Bill 4 Berton 示例表B: book_id author_id start_date end_da ...
随机推荐
- in和exists
exists和in的使用方式: #对B查询涉及id,使用索引,故B表效率高,可用大表 -->外小内大 select * from A where exists (select * from B ...
- CSS设置文本末行显示省略号...
首先设置文本标签或文字所在标签的宽度 最主要是以下三点: ①white-space:nowrap;如果是中文需要设置行末不断行 ②overflow:hidden;设置控 ...
- [osg][osgearth]osg的分页加载,代码和结构图
DatabasePager加载数据的过程: 多线程 使用DatabasePager加载数据的流程: 左侧的图框表示数据的检索和输入, 中间的白色框表示用于数据存储的内存空间,而右边的图框表示存储数据的 ...
- UVA-129 Krypton Factor(回溯)
题目大意:由字母A到Z组成的字符串,其中有两个子串完全相同的叫做容易的串,反之叫困难的串.找出由前L个字母组成的第n个困难的串. 题目分析:简单回溯,不过要判断是否存在重复子串比较棘手.<入门经 ...
- java并发编程:线程安全管理类--原子操作类--AtomicInteger
在java并发编程中,会出现++,--等操作,但是这些不是原子性操作,这在线程安全上面就会出现相应的问题.因此java提供了相应类的原子性操作类. 1.AtomicInteger
- qt Cannot connect creator comm socket /tmp/qt_temp.S26613/stub-socket: No such
Tool->Options->Environment->General 将terminal改为 xterm -e
- 在JavaScript中进行文件处理,第四部分:对象URLs
译注:原文是<JavaScript高级程序设计>的作者Nicholas Zakas写的,本翻译纯属为自己学习而做,仅供参考.原文链接:这里 学习到这里,你已经了解在传统方式中如何使用文件, ...
- 『转』谷歌发布Windows版Chrome App Launcher
据国外媒体报道,谷歌发布了Windows版Chrome App Launcher,Windows用户现在因此能够使用谷歌的许多网络应用,如Chrome浏览器.Gmail.Google Drive和Ch ...
- New Concept English Two 11 28
$课文26 最佳艺术评论家 256. I am an art student and I paint a lot of pictures. 我是个学艺术的学生,画了很多画. 257. Many peo ...
- composer update 提示 username
解决办法 暂时修改composer.json "repositories": { "packagist": { "type": " ...