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
没有必要,但我喜欢一致。