依赖于另一个字段的自动递增字段[重复]

Posted

技术标签:

【中文标题】依赖于另一个字段的自动递增字段[重复]【英文标题】:Auto-incrementing field that depends on another field [duplicate] 【发布时间】:2013-12-27 19:44:03 【问题描述】:

我有两个模型,A 和 B。A 有很多 B。最初,A 和 B 都有一个名为 id 的自动递增主键字段,而 B 有一个 a_id 字段。现在我发现自己需要为 A 中的每个 B 提供一个唯一的数字序列。我一直在我的应用程序中跟踪这一点,但后来我认为让数据库来处理它可能更有意义。我想我可以给 B 一个复合键,其中第一个组件是 a_id,第二个组件自动递增,同时考虑到 a_id。因此,如果我插入两条 a_id 1 的记录和一条 a_id 2 的记录,那么我将得到类似:

a_id | other_id
   1 |        1
   1 |        2
   2 |        1

如果编号较小的 id 被删除,则序列不应回收这些编号。所以如果 (1, 2) 被删除:

a_id | other_id
   1 |        1
   2 |        1

当添加下一条 a_id 为 1 的记录时,表格将如下所示:

a_id | other_id
   1 |        1
   2 |        1
   1 |        3

如何在 SQL 中执行此操作?有理由不做这样的事情吗?

我正在使用内存 H2(测试和开发)和 PostgreSQL 9.3(生产)。

【问题讨论】:

SQL 只是 结构化查询语言 - 许多数据库系统使用的语言,但不是数据库产品...很多事情都是特定于供应商的 - 所以我们真的需要知道您正在使用什么数据库系统(以及哪个版本)(请相应地更新标签)...... 你为什么需要这个? @marc_s 查看更新。不过,我正在尝试尽可能不明确地指定供应商。 other_id 真的应该是一个 id 吗?如果相同 a_id 的 other_id 较低的行被删除,是否应该更新 other_id?如果删除 other_id 最大的行,然后插入另一行,那么该行的 other_id 是否应该为 +1? @Max other_id 如果删除了较小的数字,则不应更新。感谢您指出了这一点。我会更新问题。 【参考方案1】:

您的问题的答案是您需要一个触发器才能获得此功能。但是,您可以只创建一个使用 row_number() 函数的视图:

create view v_table as
    select t.*,
           row_number() over (partition by a order by id) as seqnum
    from table t;

我在哪里调用表 id 的主键。

【讨论】:

这只适用于不删除较低数字的情况,请参阅上面的 cmets。如果一个较小的数字被删除,row_number 也会被更新,这是不应该发生的。 请参阅有关删除的更新。 as seqnum 是做什么的?我试图搜索它,但找不到任何东西。 "as seqnum" 只是为列分配一个名称。 @mushroom 。 . .如果您需要在删除后保留该值,那么我认为您需要使用触发器。

以上是关于依赖于另一个字段的自动递增字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章

关于数据库字段重复时,名称自动加1的问题

Django 模型字段依赖于另一个模型字段

arcgis设计的点如何自动编号

使CSS属性依赖于另一个[重复]

如何使用ZF2中的数组表单设置使字段验证依赖于另一个字段?

导入 SQL 文件时自动递增