每种类型生成唯一的序列ID

时间:2014-11-05 16:22:59

标签: sql postgresql scala slick

以下是传达问题陈述的说明性示例 -

说我有一个名为Animal的表,它存储所有动物类型的数据,例如catdogcowmonkey等。

Animal table
id  type_id   type    json_data

现在业务要求是type_id值应该是type的一致和顺序。 e.g。

id(PK)   type_id   type   json_data
1             1    cat    
2             2    cat    
3             50   dog   
4             51   dog
5             3    cat   
6             52   dog

DB是postgres,Env是Scala和Slick for persistence layer

每种动物类型的序列生成器,每个记录应该具有唯一的生成(类型)id,但是基于示例中提到的类型顺序。对于所有猫的记录,type_id必须是唯一的和顺序的,所有狗记录都是如此。创建此类顺序ID的最佳方法是什么,而不会与其他类型的ID产生冲突?

1 个答案:

答案 0 :(得分:0)

我认为您需要一个函数并在INSERT INTO

中调用该函数
 -- Create the function
  CREATE OR REPLACE FUNCTION last_category(in varchar(50))
   RETURNS INT AS
  $BODY$
  DECLARE
    some_input ALIAS FOR $1;
    last_category int;
  BEGIN
    select max(type_id) + 1 into last_category from animal where type=some_input;
    return last_category;
  END$BODY$
   LANGUAGE plpgsql VOLATILE
   COST 100;
  ALTER FUNCTION last_category(in varchar(50))
   OWNER TO postgres;
  COMMENT ON FUNCTION last_category(in varchar(50)) IS 'FUNCTION JUST FOR TEST';

 -- Now, call the function inside your INSERT INTO
 insert into animal values(3,last_category('cat'),'cat','');