【问题标题】:Upserting with Postgresql使用 Postgresql 进行更新插入
【发布时间】:2014-01-15 11:51:12
【问题描述】:

我有类似这样的表:

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 错误:“更新”处或附近的语法错误 第 3 行:更新萨尔多

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

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

【问题讨论】:

    标签: sql postgresql pdo


    【解决方案1】:

    您需要将“with”部分作为带有结果的正确查询。 UPDATE 本身不会返回结果,因此 Postgres 对此抱怨。链接下给出的示例在 with 查询部分使用 UPDATE .... RETURNING 来实现这一点。顺便说一句,您应该始终提及您正在使用的 PG 版本。另外,请查看this

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2014-10-16
      • 2012-10-04
      • 1970-01-01
      • 2014-05-03
      • 2021-12-14
      • 2022-01-26
      • 1970-01-01
      • 2013-06-20
      相关资源
      最近更新 更多