【问题标题】:generate unique sequence id per type为每种类型生成唯一的序列 ID
【发布时间】:2014-11-05 16:22:59
【问题描述】:

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

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

Animal table
id  type_id   type    json_data

现在的业务要求是type_id 的值应该与type 一致且连续。例如

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 是持久层

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

【问题讨论】:

  • 另一个名为AnimalTypes 的表,其中type_idAnimalTypes.id 的外键,因为这就是关系数据库的用途。
  • @m-z :刚刚在问题中添加了更多详细信息。如果问题中有任何混淆,请告诉我。

标签: sql postgresql scala slick


【解决方案1】:

我认为您需要一个函数并在 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','');

【讨论】:

  • @user2066049 根据this,您必须使用普通查询来执行此操作。我以前没有使用过 Slick,但我认为如果你以 Slick 方式这样做,算法会是一样的
猜你喜欢
  • 2021-01-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-30
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多