将两个单独的更新查询合并到一个复合查询中

时间:2013-09-22 03:04:42

标签: mysql

我有两个单独的更新查询,即“更新查询#1”& “Udpate查询#2”。我想将这两个查询组合成一个复合查询。

QUERY#1: / 删除[addr.stuupd] /

中的错误日期
UPDATE addr
   SET addr.STUUPD= NULL
 Where addr.STUUPD='0000-00-00 00:00:00'

QUERY#2: / 删除[loan.DDBTUPD]日期字段 /

中的错误日期
UPDATE loan
   SET loan.DDBTUPD= NULL
 Where loan.DDBTUPD='0000-00-00 00:00:00'

2 个答案:

答案 0 :(得分:1)

我冒昧地假设这里的真正问题是确保两个表同时更新,并且更新都不会失败。在那种情况下,我会使用交易。

复合查询通常仅用“select”语句引用。 “事务”提供了对多个更新的可靠处理,因为如果更新的一部分失败,它们支持回滚。

注意:交易仅适用于InnoDB表。

您可以使用

将表格更改为InnoDB
mysql> alter table `addr` engine = InnoDB
mysql> alter table `loan` engine = InnoDB

之前...

mysql> select * from loan ;
+--------+---------------------+
| loanid | DDBTUPD             |
+--------+---------------------+
|      1 | 0000-00-00 00:00:00 | 
|      2 | 0000-00-00 00:00:00 | 
|      3 | 0000-00-00 00:00:00 | 
+--------+---------------------+

交易......

mysql> START TRANSACTION;  
Query OK, 0 rows affected (0.00 sec)

mysql> UPDATE addr SET addr.STUUPD= NULL Where addr.STUUPD='0000-00-00 00:00:00' ;
Query OK, 4 rows affected (0.01 sec)

mysql> UPDATE loan SET loan.DDBTUPD= NULL Where loan.DDBTUPD='0000-00-00 00:00:00' ;
Query OK, 3 rows affected (0.00 sec)

此时,您将能够看到更新的结果,但其他用户将不会

mysql> select * from loan ;
+--------+---------+
| loanid | DDBTUPD |
+--------+---------+
|      1 | NULL    | 
|      2 | NULL    | 
|      3 | NULL    | 
+--------+---------+

您需要提交交易

mysql> COMMIT ; 
Query OK, 0 rows affected (0.01 sec)

我怀疑如果其中一个表的日期等于'0000-00-00 00:00:00'而另一个表没有,那么下面的peterm解决方案会遇到问题。 peterm的查询可能不会按预期使所有内容无效。我很高兴被证明是错的。

答案 1 :(得分:0)

虽然技术上可以使用像这样的查询

UPDATE addr a JOIN loan l 
    ON a.stuupd = '0000-00-00 00:00:00'
   AND l.ddbtupd = '0000-00-00 00:00:00'
   SET a.stuupd = NULL, 
       l.ddbtupd = NULL

这是 SQLFiddle 演示

问题仍然是出于什么实际原因?