【问题标题】:How to set a NULL value into a number in PostgreSQL?如何将 NULL 值设置为 PostgreSQL 中的数字?
【发布时间】: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


【解决方案1】:

虽然这不是我在我的数据库中所做的,但这里是您的函数的工作示例:

CREATE OR REPLACE FUNCTION insert_details(_pname text)
RETURNS void AS
$BODY$
declare
    _pid int;
begin
   _pid := (select max(pid) from tablea);
   _pid := coalesce(_pid, 0) + 1;

   insert into tablea(pid,pname)
   values(_pid,_pname);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

sql fiddle demo

你完全可以在没有变量的情况下做到这一点:

CREATE OR REPLACE FUNCTION insert_details(_pname text)
RETURNS void AS
$BODY$
begin
   insert into tablea(pid,pname)
   values (coalesce((select max(pid) from tablea), 0) + 1, _pname);
end;
$BODY$
LANGUAGE plpgsql VOLATILE
COST 100;

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-10-01
    • 1970-01-01
    • 2021-12-31
    • 1970-01-01
    • 2021-03-13
    • 2018-09-25
    • 1970-01-01
    相关资源
    最近更新 更多