1

我有一张名为 members 的桌子

CREATE TABLE netcen.mst_member
(
  mem_code character varying(8) NOT NULL,
  mem_name text NOT NULL,
  mem_cnt_code character varying(2) NOT NULL,
  mem_brn_code smallint NOT NULL, -- The branch where the member belongs
  mem_email character varying(128),
  mem_cell character varying(11),
  mem_address text,
  mem_typ_code smallint NOT NULL,
  CONSTRAINT mem_code PRIMARY KEY (mem_code ))

每种成员类型的成员代码都有不同的顺序。即对于黄金会员,他们的会员代码将是

GLD0091、GLD0092、...

和白金会员代码将是

PLT00020, PLT00021,...

我希望将字段 mem_code 的默认值作为动态值,具体取决于所选的成员类型。我如何使用检查约束来实现它?请帮忙,我正在使用 Postgresql 9.1

我已经创建了以下触发器函数来构造字符串,但是当我按照 Randy 所说的那样插入成员表时仍然出现错误。

CREATE OR REPLACE FUNCTION netcen.generate_member_code()
  RETURNS trigger AS
$BODY$DECLARE 
tmp_suffix text :='';
tmp_prefix text :='';
tmp_typecode smallint ;
cur_setting refcursor;
BEGIN
OPEN cur_setting FOR
EXECUTE 'SELECT typ_suffix,typ_prefix,typ_code FROM mst_member_type WHERE type_code =' || NEW.mem_typ_code ;
FETCH cur_setting into tmp_suffix,tmp_prefix,tmp_typecode;
CLOSE cur_setting;
NEW.mem_code:=tmp_prefix || to_char(nextval('seq_members_'|| tmp_typecode), 'FM0000000') || tmp_suffix;
END$BODY$
  LANGUAGE plpgsql VOLATILE
  COST 100;
ALTER FUNCTION netcen.generate_member_code()
  OWNER TO mnoma;

我哪里出错了?我收到以下错误

ERROR:  relation "mst_member_type" does not exist
LINE 1: SELECT typ_suffix,typ_prefix,typ_code FROM mst_member_type W...
                                                   ^
QUERY:  SELECT typ_suffix,typ_prefix,typ_code FROM mst_member_type WHERE typ_code =1
CONTEXT:  PL/pgSQL function "generate_member_code" line 7 at OPEN
4

1 回答 1

3

我认为这是一个规范化问题。

您提供的代码可从其他信息推导出来 - 因此实际上不属于独立列。

您可以将类型存储在一列中,将数字存储在另一列中 - 然后在需要的任何查询中将它们附加在一起以制作此组合代码。

如果您想保留这个非规范化的解决方案,那么您可以创建一个触发器以在任何插入或更新时构造字符串。

于 2013-01-14T13:58:38.263 回答