为了模仿MySQL-REPLACE语句(也称为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_users SQL函数中是否需要第二对BEGIN/COMMIT?
发布于 2010-10-31 19:44:23
您不能使用SQL作为一种语言,您需要pl/pgsql,因为SQL中缺少if-else结构。
在pl/pgsql中,您可以使用特殊变量FOUND来查看查询是否找到了什么。
UPDATE ...;
IF NOT FOUND THEN -- UPDATE didn't touch anything
INSERT ...;
END IF;不需要额外的SELECT语句。
发布于 2010-10-31 16:40:24
IF EXISTS(<query to select record required for update>)
UPDATE ...
ELSE
INSERT ...https://stackoverflow.com/questions/4062356
复制相似问题