静态插入后的Doctrine增量ID

时间:2017-10-04 15:37:55

标签: php postgresql symfony doctrine-orm

所以我创建了一个包含很多数据的sql脚本,我在postgresql数据库中运行。我在应用程序中使用Doctrine2 ORM来处理数据库。

我想解决的问题如下:
如果我的插入行是这样的:

INSERT INTO interneo.services VALUES
    (1, 'test', 'test', 'root', 'foo', false, now(), now());

如果我现在想要从应用程序添加一个新服务(将使用Doctrine插入行),它将向我发送一个错误,说明已经完成了id 1。如果我重新加载页面它将工作。我猜Doctrine有一些计数器,从每个模型的1开始。

有没有办法让“计数器”从最后插入的行的id开始?或者也许我的脚本中的一种方式,学说会考虑到? (比如DEFAULT而不是1或者其他东西,但是postgresql似乎没有那样的东西,或者我没有正确搜索)。

无论如何,谢谢你的帮助。我非常感激。

1 个答案:

答案 0 :(得分:0)

我假设您插入的第一个字段是您的ID ..

正常方式

根本不指定ID并让DBS(Postgres)处理此问题。请参阅此答案如何执行此操作:How to set auto increment primary key in PostgreSQL?

在字段上设置主键属性,然后在INSERT语句中省略ID - 无需指定。

是的,那么你可能需要在insert语句中指定字段名称 - 但这样做无论如何都是很好的做法。

请注意,如果您的姓名是' property是一个自动增量字段,您需要将@Id注释添加到实体Document for Doctrine中的字段。 See here。通常,每个实体都有这个。

Postgres:设置主键开始

我刚刚看到你的问题是你导入了一个没有PRIMARY KEY字段的表,你似乎无法重新创建它。

两种方式:

  • 如果ID不重要(没有人引用它们),只需导出行,添加主要内容,再次导入行而不使用ID字段
  • 创建自定义序列:

首先创建它:

  CREATE SEQUENCE services_sequence
  start 48454189498
  increment 1;

然后您可以在查询中使用它:

INSERT INTO interneo.services VALUES
(nextval('services_sequence'), 'test', 'test', 'root', 'foo', false, now(), now());

Doctrine甚至有一个SequenceGenerator - 你显然可以使用它。 Check out the documentation

复杂的学说方式

或者,您可以设置prePersist Event Listener in Doctrine。 Listener将在您的表上进行单个MAX(id)查询,递增1并在您的实体上设置ID。

这也容易失败,因为没有人能够判断监听器的MAX()查询和实际的INSERT语句之间是否可以插入另一条记录 - 然后我们会发生另一次碰撞。

所以 - 让Postgres处理它。这就是它的用途; - )