PostgreSQL 更新未按预期工作

Posted

技术标签:

【中文标题】PostgreSQL 更新未按预期工作【英文标题】:PostgreSQL update not working as expected 【发布时间】:2018-08-17 15:52:28 【问题描述】:

拥有 20 多年的 MS Access 和 SQL Server 经验,我不是 SQL 新手,但我是 PostgreSQL 新手,遇到的问题让我觉得自己像个菜鸟。我有一个简单的 UPDATE 查询,我想用源视图 m 中的数据更新目标表 d:

UPDATE chgman.tc_data 
SET reporttime = m.reporttime, endtime = m.endtime, 
    itismessage = m.itismessage, shortdesc = m.shortdesc, 
    longdesc = m.longdesc, severity = m.severity, 
    tc_source = m.tc_source, tc_state = m.tc_state, 
    ushr_state = m.ushr_state, mainroad = m.mainroad, 
    start_location = m.start_location, end_location = m.end_location     
FROM 
    chgman.tc_matched_raw AS m 
INNER JOIN 
    chgman.tc_data AS d ON d.tc_id = m.tc_id;

查询的结果是表 d 中的每一行都填充了视图 m 的第一行中的数据。

我已经为尴尬做好了准备 - 请告诉我我做错了什么......

【问题讨论】:

我想我可能能够回答我自己的问题——事实上,视图是从目标表中获取数据的。我需要将视图保存为临时表,然后运行查询。 【参考方案1】:

Postgres 中的 from/update 与 SQL Server/MS Access 的工作方式略有不同。

这应该做你想做的:

UPDATE chgman.tc_data d
   SET reporttime = m.reporttime, . . .
   FROM chgman.tc_matched_raw m 
   WHERE d.tc_id = m.tc_id;

您不要在FROM 子句中重复该表——这是对该表的新引用。

【讨论】:

行得通,@Gordon。用 WHERE 子句替换 JOIN 就可以了。谢谢!

以上是关于PostgreSQL 更新未按预期工作的主要内容,如果未能解决你的问题,请参考以下文章

Postgres 中的 LTREE 祖先查询未按预期工作

Postgresql 外部联接未按预期工作

Postgresql 可序列化事务未按预期工作

针对特定用户的 PostgreSQL RLS 策略未按预期工作并适用于所有用户

sqlCommandBuilder 更新未按预期工作

mycursor.executemany 更新未按预期工作