簡體   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