gpt4 book ai didi

sql - 使用 Postgresql 更新

转载 作者:行者123 更新时间:2023-11-29 13:32:11 25 4
gpt4 key购买 nike

我有类似这样的表格:

CREATE TABLE saldo (
id bigint NOT NULL,
uid integer,
value numeric(12,2),
currency character(3)
);

CREATE SEQUENCE saldo_id_seq
START WITH 1
INCREMENT BY 1
NO MAXVALUE
NO MINVALUE
CACHE 1;
ALTER TABLE ONLY saldo ALTER COLUMN id SET DEFAULT nextval('saldo_id_seq'::regclass);

ALTER TABLE ONLY saldo
ADD CONSTRAINT saldo_id_key UNIQUE (id);

我想更新行(如果存在)或插入(如果不存在),所以我找到了一些关于升级 here 的信息.这是我得到的:

$saldo = $Db->prepare("
WITH update_outcome AS(
UPDATE saldo
SET value=value+ :value
WHERE uid=:uid AND currency=:currency
),
insert_outcome AS (
INSERT INTO
saldo
(uid, value, currency)
SELECT
:uid2 AS uid,
:value2 AS value,
:currency2 AS currency
WHERE NOT EXISTS (SELECT id FROM saldo WHERE uid= :uid3 AND currency= :currency3 LIMIT 1)
)");
$saldo->bindParam(':uid', $uid, PDO::PARAM_INT);
$saldo->bindParam(':value', $_SESSION['throw'], PDO::PARAM_STR, 8);
$saldo->bindParam(':currency', $_SESSION['currency'], PDO::PARAM_STR, 3);
$saldo->bindParam(':uid2', $uid, PDO::PARAM_INT);
$saldo->bindParam(':value2', $_SESSION['throw'], PDO::PARAM_STR, 8);
$saldo->bindParam(':currency2', $_SESSION['currency'], PDO::PARAM_STR, 3);
$saldo->bindParam(':uid3', $uid, PDO::PARAM_INT);
$saldo->bindParam(':currency3', $_SESSION['currency'], PDO::PARAM_STR, 3);
$saldo->execute();

我改进了这个查询几次,但我仍然得到异常:SQLSTATE[42601]:语法错误:7 错误:“UPDATE”处或附近的语法错误第 3 行:更新 saldo

怎么了?也许有更好的方法来解决这个问题?

重要提示:可能有几行具有相同的 uid,但货币不同。

最佳答案

您需要“with”部分才能成为带有结果的正确查询。 UPDATE 本身不返回结果,所以 Postgres 对此提示。链接下给出的示例在 with 查询部分使用 UPDATE .... RETURNING 来实现。顺便说一句,你应该总是提到你正在使用的 PG 版本。另外,看看 this .

关于sql - 使用 Postgresql 更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20808287/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com