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