我正在使用带有postgres数据库的Doctrine。我的主键是按顺序设置的,就像这样:
/**
* @ORMEntity()
*/
class Thing
{
/**
* @var int
* @ORMColumn(type="integer")
* @ORMGeneratedValue()
* @ORMId()
*/
protected $id;
我坚持这样一个新的实体:
$thing = new Thing();
$em->persist($thing);
$em->flush();
当我这样做时,查询日志显示条令正在调用SELECT NEXTVAL('thing_id_seq')
,以便在执行INSERT
查询之前为新实体生成ID。
如果我插入100个实体,它将调用SELECT NEXTVAL('thing_id_seq')
100次。(我知道像这样的大容量插入应该直接用SQL完成,但你明白我的意思。(
有没有办法阻止Doctrine单独查询生成ID(然后让INSERT
查询返回id(,或者这就是它的工作方式?
我想让postgres自动生成序列值可能会使一些事情复杂化,我只是想知道这是否可能/支持。
附言:我没有使用Symfony,但我过去也使用过,所以我很乐意接受我可以调查的任何基于Symfony的答案。
PostgreSQL中自动递增列的等价物是"SERIAL"类型。但大多数人都在使用序列,因为它可以更改/重置/。。。序列,而您对SERIAL类型没有太多控制。您还可以将序列下一个值分配给列默认值,如下所示:
CREATE TABLE test (
id smallint NOT NULL DEFAULT nextval('test_id_seq')
);
如果你喜欢在你的Doctrine列中使用SERIAL类型,你可以用标记你的id属性
@ORMGeneratedValue(strategy="IDENTITY")