Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/57.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 将两个单独的更新查询合并为一个复合查询_Mysql - Fatal编程技术网

Mysql 将两个单独的更新查询合并为一个复合查询

Mysql 将两个单独的更新查询合并为一个复合查询,mysql,Mysql,我有两个独立的更新查询,即“更新查询#1”和“Udpate查询#2”。我想将这两个查询组合成一个复合查询 问题#1: /删除[addr.stupd]中的错误日期/ 问题2: /删除[loan.DDBTUPD]日期字段中的错误日期/ 虽然这样的查询在技术上是可行的 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.s

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

问题#1: /删除[addr.stupd]中的错误日期/

问题2: /删除[loan.DDBTUPD]日期字段中的错误日期/


虽然这样的查询在技术上是可行的

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
这里是演示


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

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

复合查询通常仅用“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”,而另一个表的日期不等于“0000-00-00:00:00”,我怀疑下面的peterm解决方案会遇到问题。peterm的查询可能不会像预期的那样将所有内容都清空。我很高兴被证明是错的。

你为什么要这样做?我建议保留两个单独的查询…可能有什么好处?我不确定MySQL,但它在Oracle上不起作用,除非
a.stuppd
l.ddbtupd
具有唯一的键。@AmirPashazadeh看看我提供的SQLFIDLE示例answer@user2803379它到底有用吗?
mysql> select * from loan ;
+--------+---------+
| loanid | DDBTUPD |
+--------+---------+
|      1 | NULL    | 
|      2 | NULL    | 
|      3 | NULL    | 
+--------+---------+
mysql> COMMIT ; 
Query OK, 0 rows affected (0.01 sec)