使用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/