我有类似的桌子:

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);

我想更新行,如果存在或插入如果不存在,所以我找到一些关于UpService 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对此抱怨不已。链接下面给出的示例使用UPDATE。。。。返回with查询部分来实现这一点。顺便说一下,你应该总是提到你正在使用的PG版本。另外,看看this

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

10-12 14:16
查看更多