IBM DB2 + Doctrine - 复合主键自动递增
IBM DB2 + Doctrine - Auto increment in composite primary keys
我的问题很容易理解,并且在 Whosebug 中提到了很多,并引用了 Doctrine 文档。
Every entity with a composite key cannot use an id generator other
than "ASSIGNED". That means the ID fields have to have their values
assigned before you call EntityManager#persist($entity).
我试过了,获取最后生成的 ID,将 + 1 添加到它的值和持久实体。问题是使用相同 IBM DB2 数据库的第三方软件无法添加行,因为当我以这种方式插入行时自动增量索引没有更新。
有没有办法使这个工作或更新 table 自动增量索引的方法?
提前致谢。
编辑
为了帮助您更好地理解我want/have要实现的目标,我将向您展示我的示例。
实体类
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 没有被填充,必须被填充到复合键实体中,但它是一个自动递增列,我需要让它那样工作,找到一种方法来获得table 的下一个自动增量值或更新 IBM DB2 中 table 的自动增量值。如果不是,如果我获取自动增量列的最大值,将该值加一并手动将其分配给实体,其他第三方软件将崩溃。
查询:
SELECT presence FROM DB2ADMIN.PRESENCES WHERE serie LIKE 2017 ORDER BY presence DESC FETCH FIRST 1 ROWS ONLY;
如果您需要任何进一步的信息,请告诉我。
有两种方法可以做到这一点,但由于您无权访问交易(并且显然不关心差距),我不推荐其中一种。
我建议您不要使用的第一种方法是创建一个 table 来保存生成的值,递增它,然后返回它。我previously answered a question about this for SQL Server,不过概念要翻译。请注意,由于您无法在触发器中生成值,因此部分实用程序已丢失,但仍然可以使用。剩下的主要问题是 table 代表瓶颈,您不会从中获得太多好处。
第二种方法就是每年使用一个单独的SEQUENCE
。这有点问题,因为您需要每年创建对象,但获得一个数字会快得多。你也基本上可以保证有差距。
请注意,我总是对值递增且有价值的主键有点怀疑,尤其是在允许间隙的情况下。
我的问题很容易理解,并且在 Whosebug 中提到了很多,并引用了 Doctrine 文档。
Every entity with a composite key cannot use an id generator other than "ASSIGNED". That means the ID fields have to have their values assigned before you call EntityManager#persist($entity).
我试过了,获取最后生成的 ID,将 + 1 添加到它的值和持久实体。问题是使用相同 IBM DB2 数据库的第三方软件无法添加行,因为当我以这种方式插入行时自动增量索引没有更新。
有没有办法使这个工作或更新 table 自动增量索引的方法?
提前致谢。
编辑
为了帮助您更好地理解我want/have要实现的目标,我将向您展示我的示例。
实体类
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 没有被填充,必须被填充到复合键实体中,但它是一个自动递增列,我需要让它那样工作,找到一种方法来获得table 的下一个自动增量值或更新 IBM DB2 中 table 的自动增量值。如果不是,如果我获取自动增量列的最大值,将该值加一并手动将其分配给实体,其他第三方软件将崩溃。
查询:
SELECT presence FROM DB2ADMIN.PRESENCES WHERE serie LIKE 2017 ORDER BY presence DESC FETCH FIRST 1 ROWS ONLY;
如果您需要任何进一步的信息,请告诉我。
有两种方法可以做到这一点,但由于您无权访问交易(并且显然不关心差距),我不推荐其中一种。
我建议您不要使用的第一种方法是创建一个 table 来保存生成的值,递增它,然后返回它。我previously answered a question about this for SQL Server,不过概念要翻译。请注意,由于您无法在触发器中生成值,因此部分实用程序已丢失,但仍然可以使用。剩下的主要问题是 table 代表瓶颈,您不会从中获得太多好处。
第二种方法就是每年使用一个单独的SEQUENCE
。这有点问题,因为您需要每年创建对象,但获得一个数字会快得多。你也基本上可以保证有差距。
请注意,我总是对值递增且有价值的主键有点怀疑,尤其是在允许间隙的情况下。