繁体   English   中英

PostgreSQL 9.1中的UPDATE似乎滥用了占位符类型

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM