新id的序列生成

atmip9wb  于 2021-07-26  发布在  Java
关注(0)|答案(2)|浏览(444)

我有一个要求,有两个表a和b。有一个名为id的列,它是表a的主键和表b的外键,其中表之间有一对多关系。在表a的id列中,我们有条目1、2、3,对于它们,我们有一个id对应的多个条目,在表b的另一列中,我们为其中的条目创建了序列。现在对于id 1的条目,我在表b中有3个条目,带有seq 1,2,3,但是当新的id条目出现时,我需要再次从该id的1开始排序。**您能帮我这样做吗。
表a

krugob8w

krugob8w1#

我建议你不要把这些东西存放起来 SEQ 价值观。你为什么要这么做?无论何时需要都很容易计算。怎样?像这样,使用 row_number 分析函数:

  1. SQL> with b (id, name) as
  2. 2 (select 1, 'TRI' from dual union all
  3. 3 select 1, 'TRI' from dual union all
  4. 4 select 1, 'TRI' from dual union all
  5. 5 select 2, 'ROHIT' from dual union all
  6. 6 select 2, 'ROHIT' from dual union all
  7. 7 select 3, 'RAVI' from dual
  8. 8 )
  9. 9 select id,
  10. 10 name,
  11. 11 row_number() over (partition by id order by null) seq
  12. 12 from b;
  13. ID NAME SEQ
  14. ---------- ----- ----------
  15. 1 TRI 1
  16. 1 TRI 2
  17. 1 TRI 3
  18. 2 ROHIT 1
  19. 2 ROHIT 2
  20. 3 RAVI 1
  21. 6 rows selected.
  22. SQL>

如果你还想储存它,现在你知道怎么储存了。

展开查看全部
5n0oy7gb

5n0oy7gb2#

没有多个序列。只需在b表中使用一个序列,并接受每个序列都有间隙 ID 如果需要顺序值,可以根据需要使用 ROW_NUMBER() 分析函数,如果需要的话,把它放到一个视图中。另外,不要从表中复制名称 A 在表中 B ; 保持数据正常化。

  1. CREATE TABLE A (
  2. id NUMBER(8,0)
  3. GENERATED ALWAYS AS IDENTITY
  4. CONSTRAINT A__id__pk PRIMARY KEY,
  5. name VARCHAR2(20)
  6. );
  7. CREATE TABLE B (
  8. id NUMBER(8,0)
  9. CONSTRAINT B__id__nn NOT NULL
  10. CONSTRAINT B__id__fk REFERENCES A(id),
  11. seq NUMBER(8,0)
  12. GENERATED ALWAYS AS IDENTITY
  13. CONSTRAINT B__seq__pk PRIMARY KEY
  14. );

然后可以创建示例数据:

  1. INSERT INTO A ( name )
  2. SELECT 'TRI' FROM DUAL UNION ALL
  3. SELECT 'ROHIT' FROM DUAL UNION ALL
  4. SELECT 'RAVI' FROM DUAL;
  5. INSERT INTO B ( id )
  6. SELECT 1 FROM DUAL UNION ALL
  7. SELECT 1 FROM DUAL UNION ALL
  8. SELECT 2 FROM DUAL UNION ALL
  9. SELECT 3 FROM DUAL UNION ALL
  10. SELECT 2 FROM DUAL UNION ALL
  11. SELECT 1 FROM DUAL;

以及:

  1. SELECT *
  2. FROM B

输出:

  1. ID | SEQ
  2. -: | --:
  3. 1 | 1
  4. 1 | 2
  5. 2 | 3
  6. 3 | 4
  7. 2 | 5
  8. 1 | 6

如果需要输出,请创建一个视图:

  1. CREATE VIEW B_view ( id, name, seq ) AS
  2. SELECT b.id,
  3. a.name,
  4. ROW_NUMBER() OVER ( PARTITION BY b.id ORDER BY seq )
  5. FROM B
  6. INNER JOIN A
  7. ON ( B.id = A.id )

然后:

  1. SELECT *
  2. FROM b_view

输出:

  1. ID | NAME | SEQ
  2. -: | :---- | --:
  3. 1 | TRI | 1
  4. 1 | TRI | 2
  5. 1 | TRI | 3
  6. 2 | ROHIT | 1
  7. 2 | ROHIT | 2
  8. 3 | RAVI | 1

db<>在这里摆弄

展开查看全部

相关问题