复合PK。为每个唯一的其他复合关键部件生成新的顺序键

时间:2014-11-12 07:39:15

标签: sql database oracle

表格Parentparent_id varchar为主键。表Childrenparent_id varchar, sub_id number(2,0)为主键,parent_id为外键,链接至Parent。如何针对每个唯一sub_id0开始生成parent_id。例如

---------------
Parent        |
---------------
parent_id     |
---------------
p1            |
---------------
p2            |
---------------

如果我添加3个具有外键的子项(复合主键的一部分)parent_id=p1,则sub_id应为0,1,2。然后,当我添加更多具有parent_id=p2的子项时他们的sub_id应该从0开始,而不是从3开始。是否有像这样的数据库功能?或者应该通过编码来完成?

1 个答案:

答案 0 :(得分:2)

您无法使用数据库功能执行此操作,没有。但是,您应该认真重新考虑为什么您需要这样做 - 并且最好停止。

您必须在代码中执行此操作,这意味着:

  • 为了添加记录,您必须从表中选择以查找最大sub_id或查找parent_id是否存在,然后再插入
  • 为了更新记录,您必须确定是否要更新sub_id并移动所有其他人
  • 为了删除您将移动所有sub_id s大于您删除后删除的记录。< / LI>

这不是很好,每次修改表时你必须完成的工作量增加一倍,并使你的代码复杂化。

为列sub_id创建一个正常的递增序列更为常见,而不是为每个父级重新设置它。你应该能够完成所有计算。如果你真的觉得你必须有一些重置的东西在这个表的顶部创建一个视图并动态生成你的循环序列,使用分析函数ROW_NUMBER()

select parent_id, row_number() over (partition by parent_id order by sub_id) as sub_id
  from ...