UPDATE 查询中的 FROM 后的 Postgres 语法错误

Posted

技术标签:

【中文标题】UPDATE 查询中的 FROM 后的 Postgres 语法错误【英文标题】:Postgres syntax error after FROM in an UPDATE query 【发布时间】:2021-10-14 02:42:50 【问题描述】:

我有以下疑问:

UPDATE user
SET user_status = 'ACCEPTED', last_updated = now()
FROM company
WHERE user.company_id::text = company.company_id::text
AND company.status = 'ACTIVE';

查询直接在数据库中运行时工作正常,但在将其作为 flyway 迁移脚本应用时出现以下错误:

Caused by: org.flywaydb.core.internal.sqlscript.FlywaySqlScriptException: 
Migration XXXXX.sql failed
---------------------------------------------------------------------------
SQL State  : 42000
Error Code : 42000
Message    : Syntax error in SQL statement "UPDATE USER
SET USER_STATUS = 'ACCEPTED', LAST_UPDATED = NOW()
FROM[*] COMPANY
WHERE USER.COMPANY_ID::TEXT = COMPANY.COMPANY_ID::TEXT
AND COMPANY.STATUS = 'ACTIVE'";

该错误表明FROM 存在问题。但是,我已经阅读了 Postgres 文档并查看了示例查询,语法与我上面使用的相同,并且似乎是正确的。

Flyway 版本:7.0.2

Postgres 版本:9.6

Postgres JDBC 驱动版本:42.2.14

谁能帮我弄清楚我为什么会遇到这个问题/帮我解决这个问题?

【问题讨论】:

@forpas。不,请参阅Error codes。 什么版本的 Flyway 和什么版本的 Postgres?添加为问题的更新。另请阅读此处UPDATE 的兼容性部分,了解有关FROM 子句的说明。 @AdrianKlaver 正确,但对于有效的 Postgresql 语句,该错误是不可理解的。 FROM 子句上的此错误将在不支持 UPDATE ... FROM 语法的 mysql(和其他)中抛出。 检查你的 postgres 错误日志,它应该有 flyway 使用的实际查询。 我会说这是你需要向 Flyway 的人提出的问题。 【参考方案1】:

由于user 是保留字,所以需要在引号内:

UPDATE "user"
SET user_status = 'ACCEPTED', last_updated = now()
FROM company
WHERE "user".company_id::text = company.company_id::text
AND company.status = 'ACTIVE';

(已对此进行测试并确认它可以解决问题)

【讨论】:

这里的“用户”的使用不是问题,问题是“来自”的使用——你也是通过什么方式测试的?创建了一个脚本并使用 flyway 迁移它​​? 确实:我认为在 FROM 周围的调试中的输出是一个红鲱鱼 - 当我重现问题时,我运行 flyway 进行调试(我是 Flyway 开发团队的一员)和生成的脚本要执行的未以该格式公开FROM。重现问题后,我将表重命名为 Test1Test2,问题就消失了。将表名恢复为原始名称并使用引号也解决了该问题。

以上是关于UPDATE 查询中的 FROM 后的 Postgres 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

mysql 的delete from 和update子查询限制

Oracle Bulk Collect and Update from cursor or user Update with Select 子查询

leedcode上SQL第二题,1.“~salary”中的~是啥意思? 2. from括号后的x怎么理解? 3. limit 1,1 是指?

更新子查询(WHERE/FROM)

mybatis通过selectkey返回insert或update后的值

由SELECT ... FROM ... FOR UPDATE想到的