IBM DB2 + Doctrine - 复合主键的自动增量

时间:2017-10-27 18:00:59

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

我的问题很容易理解,很多人在Stackoverflow中提到了Doctrine docs的引用。

  

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

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

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

提前致谢。

修改

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

EntityClass

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中的表的更新自动增量值。如果没有,如果我获得自动增量列的最大值,其他第三方软件将崩溃,将该值增加1并手动将其分配给实体。

查询:

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

如果您需要任何进一步的信息,请与我们联系。

1 个答案:

答案 0 :(得分:1)

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

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

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


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

相关问题