gpt4 book ai didi

mysql - 左连接更新的行为

转载 作者:行者123 更新时间:2023-11-29 08:17:42 24 4
gpt4 key购买 nike

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com