【问题标题】:IBM DB2 + Doctrine - Auto increment in composite primary keysIBM DB2 + Doctrine - 复合主键中的自动增量
【发布时间】:2017-10-27 18:00:58
【问题描述】:

我的问题很容易理解,并且在 Stackoverflow 中提到了很多,并参考了 Doctrine 文档。

每个具有复合键的实体都不能使用其他的 id 生成器 比“分配”。这意味着 ID 字段必须有它们的值 在调用 EntityManager#persist($entity) 之前分配。

我尝试了这个,获取最后生成的 ID,将 + 1 添加到其值并持久化实体。问题是使用相同 IBM DB2 数据库的第三方软件无法添加行,因为我以这种方式插入行时不会更新自动增量索引。

有没有办法使这项工作或更新表自动增量索引的方法?

提前致谢。

编辑

为了帮助您更好地理解我想要/必须实现的目标,我将向您展示我的示例。

实体类

class Entity
{
    /**
     *  @ORM\Id
     *  @ORM\Column(type="string", name="serie")
     */
     protected $serie;

    /**
     *  @ORM\Id
     *  @ORM\Column(type="integer", name="reference")
     *  @ORM\GeneratedValue
     */
     protected $reference;
     // More code...
}

教义允许多个主键,但由于某种原因,当我以这种方式填充实体时

$entity = new Entity();
$entity->set("serie", date('Y')); // Custom setter that search the property and sets the value. In this case, current year as string
 // More assignements, except for the autoincrement value
$em->persist($entity);
$em->flush();

它抛出一个异常,说其中一个 id 未填充并且必须填充在复合键实体中,但它是一个自动增量列,我需要让它以这种方式工作,找到一种方法来获取下一个表的自动增量值或更新 IBM DB2 中表的自动增量值。如果没有,如果我获得自动增量列的最大值,其他第三方软件将崩溃,将该值加一并手动将其分配给实体。

查询:

SELECT presence FROM DB2ADMIN.PRESENCES WHERE serie LIKE 2017 ORDER BY presence DESC FETCH FIRST 1 ROWS ONLY;

如果您需要任何进一步的信息,请告诉我。

【问题讨论】:

  • 我认为他们主要是在你有一个复合键时说,其中“自动生成”部分重复每个键的其余部分。也就是说,(keyColumnAValueA, 0)(keyColumnAValueB, 0) 都有效。我所知道的没有数据库会在这里自动生成 - 期望自动生成的键是完全代理的 - 代表其他键,而值本身是没有意义的;重复的意味着该值具有一定的意义。那么这个 ID 有什么用呢?
  • @Clockwork-Muse 感谢您的评论。我根本不关注你。也许我在谈论复合键时弄错了,或者我真的不明白你在说什么,对不起:(我会更新我的问题,这样你就可以更好地了解我想要实现的目标
  • 好的...您希望$reference 的值在整个表中是唯一的,还是每个$serie 都是唯一的?
  • @Clockwork-Muse 每个系列都是独一无二的
  • 好的,您需要关于序列本身的任何保证吗?间隙是允许的,还是根本不允许?如果发生ROLLBACK,应该发生什么,序列不应该消耗生成并插入到表中的值吗?

标签: laravel doctrine-orm doctrine db2 laravel-5.4


【解决方案1】:

有两种方法可以做到这一点,但由于您无权访问交易(而且显然不关心差距),我不推荐其中一种。

我建议您不要使用的第一种方法是创建一个表来保存生成的值,将其递增并返回它。我previously answered a question about this for SQL Server,但这个概念应该翻译。请注意,由于您无法在触发器中生成值,因此某些实用程序会丢失,但仍应有效。剩下的主要问题是该表代表了一个瓶颈,您不会从中获得太多好处。

第二种方法是每年使用一个单独的SEQUENCE。这有点问题,因为您需要每年创建对象,但获得数字会快得多。你也基本上可以保证有差距。


请注意,我总是对值递增并具有值的主键有点怀疑,尤其是在允许间隙的情况下。

【讨论】:

  • 谢谢。在查看数据库后,第三方软件有一个名为“计数器”的表。它引用表的 ID。我只需要更新该表中的引用。现在它就像一个魅力。感谢您的宝贵时间
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-11
  • 1970-01-01
  • 2012-04-16
  • 2015-06-08
  • 2012-08-11
  • 2014-03-18
相关资源
最近更新 更多