依赖于另一个字段的自动递增字段[重复]
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 。 . .如果您需要在删除后保留该值,那么我认为您需要使用触发器。以上是关于依赖于另一个字段的自动递增字段[重复]的主要内容,如果未能解决你的问题,请参考以下文章