所以我创建了一个包含很多数据的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似乎没有那样的东西,或者我没有正确搜索)。
无论如何,谢谢你的帮助。我非常感激。
答案 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。通常,每个实体都有这个。
我刚刚看到你的问题是你导入了一个没有PRIMARY KEY字段的表,你似乎无法重新创建它。
两种方式:
首先创建它:
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处理它。这就是它的用途; - )