对指定 VALUE 使用 UPDATE 时出现 Amazon Redshift 语法错误

Posted

技术标签:

【中文标题】对指定 VALUE 使用 UPDATE 时出现 Amazon Redshift 语法错误【英文标题】:Amazon Redshift syntax error when using UPDATE on specified VALUEs 【发布时间】:2017-02-22 20:50:46 【问题描述】:

这是我尝试运行的查询,以通过单个字符串中的 ID 更新多行。我正在使用 AWS Redshift(它基于非常旧的 PostgreSQL 版本):

UPDATE promotion
   SET engagements = c.engagements
  FROM (VALUES (668, 73), (684, 135), (680, 73), (672, 76), (682, 94),
               (676, 4), (670, 81), (686, 104), (678, 1), (674, 0)
       ) AS c(id, engagements)
 WHERE c.id = promotion.id;

这是正在产生的错误:

sqlalchemy.exc.ProgrammingError: (pg8000.core.ProgrammingError) (u'ERROR', 
u'42601', u'syntax error at or near ","', u'72', u'/home/ec2-
user/padb/src/pg/src/backend/parser/parser_scan.l', u'699', u'yyerror', u'', 
u'')
[SQL: 'UPDATE promotion SET engagements = c.engagements FROM (VALUES 
(668, 73), (684, 135), (680, 73), (672, 76), (682, 94), (676, 4), (670, 81), 
(686, 104), (678, 1), (674, 0)) AS c(id, engagements) WHERE c.id = 
promotion.id;']

编辑:使用此处答案中的查询格式:Update multiple rows in same query using PostgreSQL

【问题讨论】:

@jarcobi889 是的,已修复。 这只是从网上查看其他人的代码进入黑暗的一种方式,但通常不是将 VALUES 放在括号外的格式吗? : FROM VALUES ((668, 73), (684, 135)...等 来自unsupported Postgres features: "VALUES 列表用作常量表" @jarcobi889 我从这里得到它:***.com/questions/18797608/… Redshift 根本不支持这种语法。您所指的答案是针对 Postgres,而不是针对 Redshift 【参考方案1】:

Redshift 仅支持插入的 VALUES 合成器。但是,如果您真的想在不同的上下文中使用类似的东西,您可以使用 UNION 构造一个语句:

UPDATE promotion
SET engagements = c.engagements
FROM (
    SELECT 668 as id, 73 as engagements
    UNION SELECT 684, 135
    UNION SELECT 680, 73
    -- to be continued
) c
WHERE c.id = promotion.id;

但我最好将记录插入到表中,然后 UPDATE FROM 该表

【讨论】:

以上是关于对指定 VALUE 使用 UPDATE 时出现 Amazon Redshift 语法错误的主要内容,如果未能解决你的问题,请参考以下文章

同时执行UPDATE时出现死锁

spring使用@Value注解读取.properties文件时出现中文乱码问题的解决

求教大神,update tb set a=a*10报错将 numeric 转换为数据类型 numeric 时出现算术溢出错误

在 WSL 中运行 shell 脚本时出现“E: Invalid operation update”错误

mysql中update时出现时报错Deadlock found when trying to get lock; try restarting transaction的原因以及解决方式

sql数据库更新语句