代码之家  ›  专栏  ›  技术社区  ›  Alexander Farber

检测PostgreSQL SQL函数中的更新失败(不是pl/pgsql)

  •  4
  • Alexander Farber  · 技术社区  · 15 年前

    为了模仿mysql replace语句(aka upsert),我需要尝试更新一个记录,如果失败,就插入它。但是,如何检测更新在我的SQL过程中失败?

    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用户sql函数中是否需要第二对begin/commit?

    2 回复  |  直到 14 年前
        1
  •  12
  •   Frank Heikens    15 年前

    FOUND 查看查询是否找到了某些内容。

    UPDATE ...;
    IF NOT FOUND THEN -- UPDATE didn't touch anything
      INSERT ...;
    END IF;
    

    不需要额外的select语句。

        2
  •  2
  •   Lavir the Whiolet    15 年前
    IF EXISTS(<query to select record required for update>)
        UPDATE ...
    ELSE
        INSERT ...