PostgreSQL 9.1中的UPDATE似乎滥用占位符types

鉴于以下模式(作为例子)

CREATE TABLE "test" ( "id" int, "title" varchar ); 

在NodeJS中,我尝试使用以下方法进行更新

 client.query( 'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' + 'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' + 'FROM new_vals nv ' + 'WHERE "t"."id"=nv.id;', [1,'test'], function(err, res){ ... } ); 

它给了我以下错误: '错误:运算符不存在:整数=文本'

好的,让我们试着停止使用"t"."id"=nv.id用一个可用的参数:

 client.query( 'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' + 'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' + 'FROM new_vals nv ' + 'WHERE "t"."id"=$1;', [1,'test'], function(err, res){ ... } ); 

还是'错误:运算符不存在:integer = text'

好的,现在我们再添加一个$3占位符:

 client.query( 'WITH new_vals ("id","title") AS (VALUES($1,$2)) ' + 'UPDATE "test" "t" SET "id"=nv.id, "title"=nv.title ' + 'FROM new_vals nv ' + 'WHERE "t"."id"=$3;', [1,'test',1], function(err, res){ ... } ); 

另一个错误: “错误:列”ID“是整数types,但expression式是文本types”

我完全失去了。 为什么不在WHERE中使用int运算符类? 这里有什么问题?

奇怪的是,没有WITH子句的标准UPDATE表单工作正常。

如果你需要使用代码: https : //gist.github.com/kolypto/7455957

在这种情况下:

 WITH new_vals ("id","title") AS (VALUES($1,$2)) 

PostgreSQL不知道什么types的$1$2将是最终被视为文本值。 细手册注意到这一点 :

INSERT使用VALUES ,这些值全部自动强制为相应目标列的数据types。 在其他情况下使用时,可能需要指定正确的数据types。

values($1, $2) ,types不能被推断,所以你必须明确:

 WITH new_vals ("id", "title") AS (VALUES($1::integer, $2::text)) 

$2没有必要,但我喜欢一致。

Interesting Posts