[英]UPDATE in PostgreSQL 9.1 seems to misuse placeholder 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”的类型为整数,但表达式的类型为文本”
我完全迷路了。 它为什么不在WHERE中使用int
运算符类? 怎么了
奇怪的是,不带WITH
子句的标准UPDATE
表单可以正常工作...
如果您需要使用以下代码: https : //gist.github.com/kolypto/7455957
在这种情况下:
WITH new_vals ("id","title") AS (VALUES($1,$2))
PostgreSQL不知道$1
或$2
是什么类型,因此它们最终将被视为文本值。 精美的手册指出 :
在
INSERT
使用VALUES
,所有值都将自动强制转换为相应目标列的数据类型。 在其他上下文中使用它时,可能有必要指定正确的数据类型。
并且在values($1, $2)
,无法推断类型,因此必须明确:
WITH new_vals ("id", "title") AS (VALUES($1::integer, $2::text))
不必对$2
进行强制转换,但我希望保持一致。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.