相关疑难解决方法(0)

如何为每个外键值实现一个序列?

在 PostgreSQL (9.3) 数据库中,我的 Accounts 和 Customers 之间是一对多的关系,因此在 Customers 表中,我有每个 Customer 的主键的全局唯一 id,以及相应的 Account id。但我还想为每个人分配一个特定于帐户的 ID - 只是一个数字,每个帐户的第一个客户从 1 开始,每个额外的客户递增 - 只是作为帐户中的用户在 UI 中引用客户的一种简单方法.

我可以想到两种可能的解决方案:

  1. 使用max()聚合函数获取用于 Account 的最后一个 Customer id 并将其递增

    • 优点
      • 相对简单(至少在概念上)
    • 缺点
      • 如果删除最新的客户,可能会导致 ID 被重用
      • 需要处理并发插入为新记录计算相同的 id
  2. 用一个 sequence

    • 优点
      • 专门设计用于处理增加值
      • 记住上次使用的值,即使相应的记录被删除
    • 缺点
      • 需要以sequence某种方式为每个新帐户创建一个单独的帐户(然后在删除帐户时/当删除帐户时将其删除),否则每个帐户将在其客户 ID 序列中得到不连续的值

更新

为了澄清最后一点,id 序列中总会出现一些差距;例如,一旦客户被删除,但这些都是意料之中的。除此之外,添加几个新客户的用户通常会希望他们有连续的 id,即使他们相隔几天添加。

OTOH,sequence为所有客户使用一个单一的客户几乎肯定会看到由分配给同时为其他账户创建的客户的 id 引入的常规的、无法解释的差距。

我不是 Postgres 专家,所以我担心我可以多么健壮地实现其中任何一个,尤其是当我一直在努力寻找任何可以遵循的示例时。

有没有普遍接受的方法来做到这一点?

postgresql sequence postgresql-9.3

9
推荐指数
1
解决办法
3009
查看次数

Oracle IDENTITY 列可以为空吗?

我想创建一个ID默认情况下自动生成唯一 ID 号的列。

用户不会通过INSERT语句插入行,而是使用开箱即用的应用程序(使用属性编辑环境)创建行。

我听说可以通过创建Oracle IDENTITY 列来实现自动生成的 ID (提示:要在链接页面中查找相关部分,请搜索​​此文本:)Use this clause to specify an identity column.


因此,我已成功创建了一个带有IDENTITY列的表:

CREATE TABLE A_TEST_TABLE (ID NUMBER GENERATED BY DEFAULT ON NULL AS IDENTITY);
Run Code Online (Sandbox Code Playgroud)

但是,我看到该字段不是 nullabe:

SELECT ID FROM ALL_TAB_COLUMNS WHERE TABLE_NAME = 'A_TEST_TABLE'

NULLABLE = N
Run Code Online (Sandbox Code Playgroud)

这是一个问题,因为我的应用程序试图“帮用户一个忙”。如果字段不可为空,应用程序会自动插入一个零作为虚拟值。这会覆盖自动生成的 ID(这当然不是我想要的)。我猜测这样做是为了避免在提交空值时从数据库收到错误消息。

为了避免我的应用程序出现此问题,是否可以将字段设为 nullabe

当我阅读文档时,它说:

如果您指定 ON NULL,那么当后续的 INSERT 语句尝试分配计算结果为 NULL 的值时,Oracle 数据库使用序列生成器为该列分配一个值。

这是否意味着IDENTITY字段可以为空?如果是这样,如何?


我承认我不知道自己在做什么。我什至不认为我最终会想要一个可以为空的 ID …

null oracle database-design identity unique-constraint

3
推荐指数
1
解决办法
335
查看次数