【发布时间】:2016-05-16 10:34:04
【问题描述】:
在postgresql中,当从父表继承serial列时,该序列由父子表共享。
是否可以继承 serial 列,同时让 2 个表具有单独的序列值,例如两个表的列都可以具有值 1。
这是否可行且合理,如果可以,该怎么做?
@更新
我想避免序列共享的原因是:
- 多个表共享单个 int 范围可能会用完 MAX_INT,使用 bigint 可以改善这一点,但需要更多空间 也是。
- 当多个表同时插入时存在一种资源锁定,所以我猜这是一个性能问题。
- id 从 1 跳到 5,然后可能跳到 1000,看起来并不那么漂亮。
@摘要
解决方案:
-
如果希望子表有自己的顺序,但仍然保持父子表之间的全局顺序。 (如
@wildplasser的回答中所述。)然后可以为每个子表添加一个
sub_id serial列。 -
如果希望子表有自己的顺序,而父子表之间不需要全局顺序,
有两种方式:
-
使用
int代替serial。 (如@lsilva的回答中所述。)步骤:
- 在父表中定义类型为int或bigint,
- 为每个父子表创建一个单独的序列,
- 使用各自序列的 nextval 为每个表指定 int 类型的默认值, 重新创建表时不要忘记维护/重置序列,
直接在子表中定义
id serial,而不是在父表中。
-
【问题讨论】:
-
向子表添加another序列列?
-
@wildplasser 您的意思是子表中有 2 个串行列吗?这肯定行得通,但我正在寻找更好的解决方案。
-
是的,当然。在大多数情况下它没有意义,但在这种情况下它可以。并且没有更好的解决方案(除了省略它并在(父序列)在子表中使用像 row_number() 这样的枚举)
-
请记住一个经常被误解的事实,即序列并不能确保 ID 的无间隙进展(因为它们如何与事务和类似的种族交互),也不能保证列值的唯一性。因此,添加额外的序列并不能保证您不会在表 A 中获得 ID 1、3、5 和在表 B 中获得 2、4、6;并且保持相同的顺序不会阻止您手动将 ID 1 插入所有表中。因此,可能值得确认为什么您要这样做,以及您希望分离的序列具有哪些属性。
-
@IMSoP 我更新了问题以添加我想要的原因。