MySQL:基于唯一标识符跨表更新数据的UPDATE语句用法咨询
解决多表关联UPDATE的语法问题
嘿,我来帮你搞定这个更新语句的问题~你的需求很明确,但原语句有几个语法细节需要调整,我分情况给你梳理正确的写法:
先说说你原语句的问题点
- 字段名的特殊字符处理:你的字段名带连字符(比如
dest-text、source-text),在绝大多数SQL数据库里,这种包含特殊字符的字段名需要用标识符引号包裹,不然会被解析成减号,直接报错。 - 多表关联的语法错误:原语句没有正确关联
dest_table和source_table,直接在WHERE里写两个表的条件,这种写法在多表UPDATE里是不生效的,需要用JOIN或者FROM子句来关联表。 - 匹配条件写错:你写的
source_table.pid = dest_table.pid不符合需求,应该是dest_table.uid = source_table.pid才对。 - 多余的逗号:
SET语句末尾多了个逗号,这会直接导致语法报错。
针对不同数据库的正确写法
下面是主流数据库的实现方式,你根据自己用的数据库选:
MySQL/MariaDB
用JOIN来关联两个表,字段名用反引号``包裹:
UPDATE dest_table JOIN source_table ON dest_table.uid = source_table.pid SET dest_table.`dest-text` = source_table.`source-text`;
PostgreSQL
用FROM子句关联,字段名用双引号包裹:
UPDATE dest_table SET "dest-text" = source_table."source-text" FROM source_table WHERE dest_table.uid = source_table.pid;
或者用别名让语句更清晰:
UPDATE dest_table dt SET "dest-text" = st."source-text" FROM source_table st WHERE dt.uid = st.pid;
SQL Server
用INNER JOIN结合FROM子句,字段名用方括号[]包裹:
UPDATE dt SET dt.[dest-text] = st.[source-text] FROM dest_table dt INNER JOIN source_table st ON dt.uid = st.pid;
额外建议
在执行UPDATE之前,建议先跑个SELECT语句验证匹配的记录是否正确,避免误更新:
比如MySQL的验证语句:
SELECT dt.uid, dt.`dest-text`, st.pid, st.`source-text` FROM dest_table dt JOIN source_table st ON dt.uid = st.pid;
内容的提问来源于stack exchange,提问作者Gruenbaer
相关产品推荐
相关产品推荐

