PostgreSQL 如何仅更新表A中version字段为NULL的记录
SQL修改方案
现有A、B两张数据库表,需按id匹配,用B表version字段更新A表对应记录,仅更新A表中version为NULL的行。
初始可执行但会全表更新的语句如下:
UPDATE A SET version = ( SELECT B.version FROM B WHERE B.id = A.id )
更新效果参考:
通用标准SQL写法(全数据库兼容)
在原语句基础上增加WHERE过滤条件即可,同时增加匹配兜底逻辑,避免B表无对应id时把A表字段更新为NULL:
UPDATE A SET version = ( SELECT B.version FROM B WHERE B.id = A.id ) WHERE A.version IS NULL AND EXISTS (SELECT 1 FROM B WHERE B.id = A.id);
核心逻辑说明:
A.version IS NULL限定仅更新A表中version字段原本为NULL的记录,非NULL值的行完全不会被改动EXISTS子句做兜底:只有B表存在相同id的对应记录时才执行更新,避免子查询无返回值时误将字段赋值为NULL
高性能关联更新写法(支持JOIN更新的数据库可用,如MySQL、PostgreSQL)
直接通过INNER JOIN关联两表,天然过滤无匹配的记录,执行效率比子查询写法更高:
UPDATE A INNER JOIN B ON A.id = B.id SET A.version = B.version WHERE A.version IS NULL;
注意:SQL中判断NULL值必须使用
IS NULL/IS NOT NULL,不能用= NULL做等值判断,否则无法命中符合条件的记录。
内容的提问来源于stack exchange,提问作者Komakino_1251
相关产品推荐
相关产品推荐

