mysql - 左连接更新的行为

标签 mysql sql-update left-join mariadb

使用mysql 5.5,语句如下:

update foo left join bar on foo.id=bar.id set foo.col='val', bar.col='val';
即使没有 bar,

似乎也会更新 foo 行(并且 bar.col= 不会生成任何错误或警告)。但据我所知,mysql 文档中并没有保证这一点。

任何人都可以在 SQL 标准中或来自 Oracle 中提供权威引用,说明这是有意为之的吗?

它在其他类型的 SQL(特别是 postgres 和 MariaDB)或其他版本的 mysql 中工作是否相同?

请注意,与上面不同的是,以下内容确实将左连接提升为内连接:

update foo left join bar on foo.id=bar.id set bar.col='val';

但这可能只是一种优化。

更新:澄清一下,我看到的行为就是我想要的行为;我只是担心它在我看来没有记录。如果我想要一个内部联接,我会使用一个。

最佳答案

在 PostgreSQL 中,这种奇怪的语法根本就是无效的。安UPDATE statement仅直接更改单个表中的数据(继承除外)。 您可以使用:

UPDATE foo
SET    col = 'val'
FROM   bar
WHERE  foo.id = bar.id;

或者,由于您使用的是常量值,因此这种更快的形式:

UPDATE foo
SET    col = 'val'
WHERE  EXISTS (
   SELECT 1
   FROM   bar
   WHERE  foo.id = bar.id
   );

.. 应该可以在任何指定的 RDMS(MySQL、SQL Server、Oracle...)中工作。

这些查询更新 foo 中在 bar 中找到匹配项的行。通常,明智的做法是添加:

AND col IS DISTINCT FROM 'val'

或者:

AND col <> 'val'                  -- if involved values are NOT NULL

..以避免空更新。

关于mysql - 左连接更新的行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20250578/

相关文章:

MySQL:在 JOIN 中合并

mysql - ruby on rails- 拒绝用户访问 'root' @'localhost'

mysql - 为什么mysql优化器不使用完整索引?

php - 如何在不同的 mysql 服务器上更新另一个表时自动更新表?

mysql - LEFT JOIN 不返回所有行

mysql - 奇怪的 : MySQL Left Join, "unknown column";同样的 leftjoin 在多表查询中不起作用

MySQL:按条件将值从表复制到另一个表

PHP/MySQL我选择多列

python - SQL - 使用临时表更新主表

mysql - 在 MySQL 中选择更新表数据