首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >检测PostgreSQL SQL-function (非PL/pgSQL)中的更新失败

检测PostgreSQL SQL-function (非PL/pgSQL)中的更新失败
EN

Stack Overflow用户
提问于 2010-10-31 16:25:32
回答 2查看 4.4K关注 0票数 4

为了模仿MySQL-REPLACE语句(也称为UPSERT),我需要尝试更新一条记录,如果更新失败,请插入它。但是,如何在SQL过程中检测到更新失败呢?

代码语言:javascript
运行
复制
begin transaction;

create table pref_users (
       id varchar(32) primary key,
       first_name varchar(32),
       last_name varchar(32),
       female boolean,
       avatar varchar(128),
       city varchar(32),
       lat real check (-90 <= lat and lat <= 90),
       lng real check (-90 <= lng and lng <= 90),
       last_login timestamp default current_timestamp,
       last_ip inet,
       medals smallint check (medals > 0)
);
create table pref_rate (
       obj varchar(32) references pref_users(id),
       subj varchar(32) references pref_users(id),
       good boolean,
       fair boolean,
       nice boolean,
       about varchar(256),
       last_rated timestamp default current_timestamp
);

create table pref_money (
       id varchar(32) references pref_users,
       yw char(7) default to_char(current_timestamp, 'YYYY-WW'),
       money real
);
create index pref_money_yw_index on pref_money(yw);

create or replace function update_pref_users(id varchar,
       first_name varchar, last_name varchar, female boolean,
       avatar varchar, city varchar, last_ip inet) returns void as $$

       update pref_users set
            first_name = $2,
            last_name = $3,
            female = $4,
            avatar = $5,
            city = $6,
            last_ip = $7
        where id = $1;

        -- XXX how to detect failure here? XXX

       insert into pref_users(id, first_name, last_name,
            female, avatar, city, last_ip)
            values ($1, $2, $3, $4, $5, $6, $7);
$$ language sql;

commit;

我的update_pref_users SQL函数中是否需要第二对BEGIN/COMMIT?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2010-10-31 19:44:23

您不能使用SQL作为一种语言,您需要pl/pgsql,因为SQL中缺少if-else结构。

在pl/pgsql中,您可以使用特殊变量FOUND来查看查询是否找到了什么。

代码语言:javascript
运行
复制
UPDATE ...;
IF NOT FOUND THEN -- UPDATE didn't touch anything
  INSERT ...;
END IF;

不需要额外的SELECT语句。

票数 13
EN

Stack Overflow用户

发布于 2010-10-31 16:40:24

代码语言:javascript
运行
复制
IF EXISTS(<query to select record required for update>)
    UPDATE ...
ELSE
    INSERT ...
票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4062356

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档