【问题标题】:Doctrine increment id after static insertion静态插入后的学说增量 id
【发布时间】:2017-10-04 15:37:54
【问题描述】:

所以我创建了一个 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 似乎没有这样的东西,或者我没有搜索正确)。

无论如何,感谢您的帮助。非常感谢。

【问题讨论】:

  • 为什么不在插入前读取现有值?
  • 感谢您的宝贵时间!如果教义必须在每次插入之前读取整个表,那不是问题吗?由于有一些大桌子,它会减慢速度吗?
  • 我的意思是尝试选择要插入的具有 id 的单个记录。
  • 去试试,谢谢你的帮助!
  • 好像行得通,但是表很多,功能已经实现了,不知道有没有更通用的方式?像学说中的方法还是什么? ://

标签: php postgresql symfony doctrine-orm


【解决方案1】:

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

正常方式

根本不指定 id 并让 DBS (Postgres) 处理。请参阅此答案如何做到这一点:How to set auto increment primary key in PostgreSQL?

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

是的,那么您可能需要在插入语句中指定字段名称 - 但无论如何这样做都是一种好习惯。

请注意,如果您的 'id' 属性是自增字段,则需要在 Doctrine 实体文档中的字段中添加 @Id 注释。 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。该侦听器将对您的表进行一次 MAX(id) 查询,递增 1 并在您的实体上设置 ID。

这也容易失败,因为没有人知道在侦听器的 MAX() 查询和实际的 INSERT 语句之间是否可以插入另一条记录 - 然后我们会再次发生冲突。

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

【讨论】:

  • 谢谢你的回答,我先试试,复杂的Doctrine方式:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2018-03-18
  • 1970-01-01
  • 1970-01-01
  • 2014-09-04
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多