Chinaunix

标题: 多表间的数据更新操作 [打印本页]

作者: neil_young    时间: 2005-12-16 14:52
标题: 多表间的数据更新操作
假设有两张表a,b
a(ID,Name,Value...)
1,n1,v1...
2,n2,v2...

b(ID,Name,Value...)
11,n1,x...
12,n1,y...
13,n2,z...

要根据表a.Name=b.Name把表b.Value更新成表a.Value
也就是更新后的期望结果
b(ID,Name,Value...)
11,n1,v1...
12,n1,v1...
13,n2,v2...

通常大家是怎么做的?根据一张表的数据更新另一张表,大家通常怎么做,一条条数据查出来再一条条update?

尝试了多表的更新语句不知道标准SQL支持不支持的?
我在MYSQL5.0里试了一下
update a,b set b.Vlaue=a.Value where a.Name=b.Name
居然不报错也没有任何反应,query result empty
作者: neil_young    时间: 2005-12-16 15:03
不好意思,我刚才数据库有点问题,
update a,b set b.Vlaue=a.Value where a.Name=b.Name
这个语句在mysql5.0下能正常运行。

还是想问问大家一般是怎么做的,还有这种是标准SQL语句吗,别的数据库一般支持吗?
有时感觉MYSQL太强了,像多表的delete操作都支持,我以前用oracel都不支持
作者: rardge    时间: 2005-12-16 15:03
是可以的
作者: neil_young    时间: 2005-12-16 15:43
标题: 如何同步一个表和另一张结构不同的备份表(多了几个字段的)
现在碰到了一个更麻烦的问题,干脆就继续发在这个贴子里。数据结构是虚拟的合理性大家不用考虑。
假设有一个班级表 class(claseID,studentID,studentName)
claseID,studentID,studentName
1, 01, 张三
1, 02, 李四
2, 03, 王五

另一个备份表classBak(claseID,studentID,studentName,description,year....)
claseID,studentID,studentName,description,year
1, 01, 张三,一年2班,2001
1, 02, 李四,一年2班,2001
2, 03, 王五,一年3班,2001
这classbak备份表里(studentID,studentName)的数据和需要和calss同步
我的第一个贴子只解决了update的问题,当class表里有删除或者增加,classbak里也需要相应的增加和删除(但不是实时的),通过用户的触发一次性同步,应该如何处理。
作者: rardge    时间: 2005-12-16 16:47
1.先找出 class 中有而 classBak 中没有的记录
SELECT a.classID, a.studentID, a.studentName FROM class AS a LEFT JOIN classBak AS b USING (classID, studentID, studentName) WHERE b.classID IS NULL;
2.把上述记录添加到 classBak 表
INSERT INTO classBak (classID, studentID, studentName) (SELECT a.classID, a.studentID, a.studentName FROM class AS a LEFT JOIN classBak AS b USING (classID, studentID, studentName) WHERE b.classID IS NULL);

class 表删除操作就是相当于上面的反向操作,classBak 中有而 class 中没有,自己写吧
最后,再用你原来的那句 sql 来同步两个表。

不过我倒要问你为什么要这么做,就不能在程序中同步做这些事情?而非要事后来维护数据的一致性?
比如,对 class 表添加删除记录时,同时对 classBak 表也进行操作,加上事务甚至外键,不是简单很多么?
作者: neil_young    时间: 2005-12-19 09:12
谢谢楼上的,因为实际中两个表各有用处,一张表处于不稳定更新状态,一张表在一个阶段稳定一些,事实上取数据从备份表中取。
作者: chujian    时间: 2005-12-24 23:25
我认为仍在事务处理里应该不错呀。为何搞的这么麻烦




欢迎光临 Chinaunix (http://bbs.chinaunix.net/) Powered by Discuz! X3.2