【发布时间】:2013-08-28 07:58:39
【问题描述】:
我有一张桌子tablea,如下所示。
我想在tablea 中插入一行,方法是从前一个插入中获取前一个值,即让它成为MAX(pid),所以默认情况下我的数据库中没有任何内容,所以 max 的查询返回 null 所以,那么当我第一次插入时得到一个空值时,我需要将pid设置为0。
这是我的SQL FIDDLE 正如我在 FIDDLE 中评论的那样,我尝试使用一些 SQL 语句。
create table tablea(
sno serial,
pid integer,
pname text
);
-- I am unable to retrieve the null value from the database and store it with pid as 0 so i had inserted this default value
insert into tablea(sno,pid,pname)
values(0,0,'default');
CREATE OR REPLACE FUNCTION insert_details(_pname text)
RETURNS void AS
$BODY$
declare
_pid int;
begin
_pid := ((select MAX(pid) from tablea)+1);
insert into tablea(pid,pname)
values(_pid,_pname);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;
【问题讨论】:
-
您知道
max(pid)解决方案在并发事务的情况下会给您错误的结果吗? -
那么在这种情况下我应该考虑什么来避免在并发执行阶段出现错误@a_horse_with_no_name
-
@a_horse_with_no_name 在并发事务上运行时我应该使用任何锁来防止冲突
-
@a_horse_with_no_name 我应该就这个话题提出另一个问题吗:-)
标签: sql postgresql postgresql-9.1 plpgsql postgresql-9.2