MySQL JOIN没有任何JOIN谓词

时间:2014-06-12 11:41:06

标签: mysql sql

我有两张桌子:

`table_1`

+----+----------+
| id | value    |
+----+----------+
|  1 | value_1  |
|  2 | value_2  |
| 10 | value_10 |
| 20 | value_20 |
| 50 | value_50 |
+----+----------+

`table_2`

+----+----------+
| id | value    |
+----+----------+
|  1 | value_1  |
|  2 | value_2  |
| 10 | value_10 |
| 20 | value_20 |
| 50 | value_50 |
+----+----------+

现在我运行了以下查询:

UPDATE table_1, table_2 SET table_1.value = 'updated' WHERE table_1.id = '20';

我得到了以下结果:

Query OK, 1 row affected (0.45 sec)
Rows matched: 1  Changed: 1  Warnings: 0

现在,如果我运行此查询:

SELECT * FROM table_1, table_2 WHERE table_1.id = '20';

我得到5行:

5 rows in set (0.00 sec)

这是非常正确的。

为什么UPDATE查询的行为方式与SELECT不相似? 是否存在将上述UPDATE查询转换为SELECT查询的通用方法,以便我们可以在不实际执行UPDATE查询的情况下获取受影响的行数?

在上述情况下,我们应该在两个查询中获得1。

2 个答案:

答案 0 :(得分:2)

受影响的行数与select返回的行数一样正确。

documentation

中已经清楚地解释了这一点
  

对于多表语法,UPDATE更新每个名为的表中的行   在table_references中满足条件。每个匹配的行是   更新一次,即使它多次符合条件。

select多次从table1返回同一行。无论如何,此行仅由update更新一次。它获得的值(如果有选择)是任意的。你不应该依赖于特定的行为。并且,更新不是累积的。

答案 1 :(得分:0)

当你添加:

,table2

你已经加入了,这就是你有这么多专栏的原因...... 但如果你想同时编辑你的2个表行,请使用:

UPDATE table_1, table_2 SET table_1.value = 'updated', table_2.value = 'updated' WHERE table_1.id = '20';