可不可以用一条SQL语句同时修改两个表的数据

说实话,之前我也曾这样做过,使用两个UPDATE语句来转换两个表中的数据,但是这要看具体的场景。
比如我之前接手的一个旧系统,需要同时更新两张表——一张是订单表,一张是库存表。
客户下订单后,必须在订单表中添加一条记录,并从库存表中减去一些商品。
当我编写 SQL 时,我编写了两个单独的 UPDATE 语句,一个用于更新订单表,另一个用于更新库存表。
关键是要保证两个操作都成功或者都失败,这就需要用事务来锁定。
记得改数据的时候,我熬了两个晚上,生怕过程中出现bug。
结果最后跑测试环境的时候居然卡住了一次,当时脸就绿了。
所以说清楚,并不难,但你只要稳住,不要出错就可以了。

SQL 对多张表的同一字段的字段值的修改

早上刚到公司,咖啡还没喝完,电脑屏幕突然一闪,出现数据库更新语句没有执行的信息。
我点击日志看了一下,哦,当然,那个旧的存储过程又出了问题。

声明@SQL VARCHAR(MAX) SELECT @SQL = ISNULL(@SQL, '') + '更新' + NAME + ' SET B = 3 WHERE B = 2 ' 按系统对象 其中类型 = 'U' 且... -
一些条件 EXEC(@SQL)
我已经修改了这段代码不少于五次。
每次都是同样的逻辑,将记录从B等于2 改为B等于3 但是这次为什么不行呢?我看着屏幕上的错误信息,突然想到:难道是数据量太多了?该表包含超过八百万条记录。
上次我们测试时,只有几十万条记录。
看得出来,他当时跑得很快。

等等,还有一件事。
我记得上次编辑的时候忘记添加索引文件了。
该表的B列没有索引,完全基于全表扫描。
超过8 00万条记录,全表扫描。
难怪我们的时间不多了。
我快速打开 SQL Server Management Studio 并添加了一个索引文件。
CREATE INDEX idx_B ON 表名 (B);只有一行。

添加索引后,我再次运行存储过程。
这一次,屏幕上的进度条缓缓移动,没有像之前那样有任何延迟。
十分钟后,提示符变为运行成功。
我松了口气,赶紧保存代码,准备发到代码库。

突然,我想到了另一个问题。
为什么这个表有这么多B等于2 的记录?是谁?是我一个人做的吗?我记得当初设计表的时候,B列的默认值是1 ,怎么变成了2 呢?等等,我好像记得有同事发过补丁,说是为了兼容第三方系统,把B列的值改成了2 难怪...
在发代码之前,我仔细检查了一下。
没错,索引添加完毕,代码执行完毕。
我把代码提交到代码仓库,然后打开邮件,准备提醒感兴趣的同事测试一下。
发邮件的时候我突然意识到:这个过程中哪个环节最关键?是索引吗?或者改变代码的逻辑?
等等,还有一件事,那位同事现在在哪个部门?上次部门重组的时候,好像被调到了项目支持部。
我得找个机会问问...

急求:现有两张表T1,T2结构相同想要修改两张表内的数据值SQL语句该怎么写

嘿,让我告诉你关于数据库同步的事情。
当我在杭州做一个项目的时候,我真的很担心。

有一年公司要建一个系统,两个表需要同步。
我创建了两个表,table1 和 table2 ,具有相同的结构。

sql 创建表表1 ( sno VARCHAR(1 0), 名称VARCHAR(1 0) );
创建表表2 ( sno VARCHAR(1 0), 名称VARCHAR(1 0) );
然后我建立了一个触发器,这是一个真正的触发器。
删除、插入和修改都必须支持。

sql 创建触发器 t_table1 在桌子上1 删除、插入、更新后 喜欢 开始吧 DELETE FROM table2 WHERE sno NOT IN (SELECT sno FROM returned); IF NOT EXISTS(从表 2 a 中选择 1 ,插入 i WHERE a.sno = i.sno) INSERT INTO table2 SELECT FROM 已插入; 其他 UPDATE table2 SET a.sname = i.sname FROM table2 a,插入 i WHERE a.sno = i.sno; 结尾; 去
这个东西相当复杂,但是使用起来确实很简单。
然后我尝试了一下并插入了一些数据。

sql INSERT INTO table1 SELECT '0001 ', 'aa' UNION ALL SELECT '0002 ', 'bb' UNION ALL SELECT '0004 ', 'dd';
你看,table1 中有多个数据项,table2 也是同步的。

sql 从表1 中选择; 从表2 中选择;
结果:
表1 : SN|姓名 ---|------ 0001 |aa 0002 |bb 0004 | dd
表2 : SN|姓名 ---|------ 0001 |aa 0002 |bb 0004 | dd
然后我删除了一条记录并尝试了。

sql 从表 1 中删除,其中 sno = '0004 ';
再看另外两个表:
sql 从表1 中选择; 从表2 中选择;
结果:
表1 : SN|姓名 ---|------ 0001 |aa 0002 | bb
表2 : SN|姓名 ---|------ 0001 |aa 0002 | bb
看到了,table2 也同时被删除了。
这东西用起来确实很方便。

再次尝试更新。

sql UPDATE table1 SET sname = 'cc' WHERE sno = '0002 ';
再看另外两个表:
sql 从表1 中选择; 从表2 中选择;
结果:
表1 : SN|姓名 ---|------ 0001 |aa 0002 |抄送表2 : SN|姓名 ---|------ 0001 |aa 0002 |抄送
表2 也被修改。
非常实用。

最后,测试完成后,我删除了该板。

sql 删除表表1 ,表2 ;
嘿,事情就是这样。
使用触发器确实很方便,但如果操作不当也会导致问题。
触发器是我在过去十年中陷入的陷阱之一。
如果你真的想使用它,你需要仔细测试一下。
这都是我自己的经历,我告诉你,别像我当年那样乱来。