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
。重现问题后,我将表重命名为 Test1
和 Test2
,问题就消失了。将表名恢复为原始名称并使用引号也解决了该问题。以上是关于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 是指?