나는 사용자가 VIP ("매우 중요한 사람")을 구매할 수있는 작은 게임 상태가로 :타임 스탬프를 확인하는 것은 null의 경우, 또는 PostgreSQL을 8.4.9에서 지난
# \d pref_users;
Table "public.pref_users"
Column | Type | Modifiers
------------+-----------------------------+---------------
id | character varying(32) | not null
vip | timestamp without time zone |
VIP는 적이있는 경우 구입 한 경우 NULL이됩니다.
vip이 만료 된 경우 < CURRENT_TIMESTAMP이됩니다.
create or replace function pref_move_week(_from varchar,
_to varchar) returns void as $BODY$
declare
has_vip boolean;
begin
select vip > current_timestamp + interval '1 week'
into has_vip from pref_users where id=_from;
if (not has_vip) then
return;
end if;
update pref_users set vip = current_timestamp - interval '1 week' where id=_from;
update pref_users set vip = current_timestamp + interval '1 week' where id=_to;
end;
$BODY$ language plpgsql;
불행하게도이 절차가 작동하지 않습니다 내가 충분히 VIP 상태를 사용자에게 허용하는 PL/pgSQL의 절차를 만들려고 해요
는 "선물"로, 다른 사용자에게 일주일을주고 떠났다 주는 사용자의 VIP가 NULL 인 경우 적절하게 :
# update pref_users set vip=null where id='DE16290';
UPDATE 1
# select id,vip from pref_users where id in ('DE16290', 'DE1');
id | vip
---------+----------------------------
DE1 | 2012-01-05 17:35:17.772043
DE16290 |
(2 rows)
# select pref_move_week('DE16290', 'DE1');
pref_move_week
----------------
(1 row)
# select id,vip from pref_users where id in ('DE16290', 'DE1');
id | vip
---------+----------------------------
DE1 | 2012-01-05 17:43:11.589922
DE16290 | 2011-12-22 17:43:11.589922
(2 rows)
e 위의 IF- 문구가 작동하지 않는 것으로 보입니다.
has_vip 변수가 여기에 전혀 필요하지 않은지 궁금합니다.
어떻게 나는 차 키 _from 및 이 _to가 pref_users 테이블에 실제로 존재 또는이 이미 알아서 있는지 확인 할 수합니다 (UPDATE 중 하나 문은 "예외가 발생하기 때문에 "트랜잭션이 롤백됩니다)?
UPDATE :
모든 답변 주셔서 감사하고 나는 또한 사용 팁을 가지고 :
if (not coalesce(has_vip, false)) then
return;
end if;
을하지만 지금은 새로운 문제가 있습니다
# select id,vip from pref_users where id in ('DE16290', 'DE1');
id | vip
---------+----------------------------
DE1 | 2012-01-05 17:43:11.589922
DE16290 |
(2 rows)
을
(즉, DE1은 5 월까지 VIP가 있고 DE16290에 일주일을 줄 수 있어야합니다.) :
# select pref_move_week('DE1', 'DE16290');
pref_move_week
----------------
(1 row)
# select id,vip from pref_users where id in ('DE16290', 'DE1');
id | vip
---------+----------------------------
DE1 | 2012-01-05 17:43:11.589922
DE16290 |
(2 rows)
(어떤 이유로 아무것도 변경되었습니다 들어?)
업데이트 2 : 최종 솔루션 -
가create or replace function pref_move_week(_from varchar,
_to varchar) returns void as $BODY$
begin
select 1 from pref_users
where id=_from and
vip > current_timestamp + interval '1 week';
if not found then
return;
end if;
update pref_users set
vip = vip - interval '1 week'
where id=_from;
update pref_users set
vip = greatest(vip, current_timestamp) + interval '1 week'
where id=_to;
end;
$BODY$ language plpgsql;
고마워요 - 네, Perl, PHP, Java, C에서 경험이 있습니다 -하지만 SQL을 사용해야 할 때마다 (기본 선택/업데이트/삭제 명령문 외) 나는 많은 어려움을 겪고 물어볼 필요가 있습니다. 업데이트 된 질문에 대한 조언이 필요하십니까? –
내 대답을 편집했습니다 ... 내가 그 논리를 올바르게 따라 왔다고 가정하면, VIP가 null이면 다시 빠져 나갈 수 있다고 생각합니다. 다소 재미있다. 만일 has_vip이 아니라면 나에게 혼란 스럽다. – Twelfth
당신의 방법은 더 낫습니다, 고마워요. –