GeneratedValue策略之间的差异

在Doctrine文档中,他们提到@GeneratedValue注释存在一些不同的策略:

  • AUTO
  • SEQUENCE
  • TABLE
  • IDENTITY
  • UUID
  • CUSTOM
  • NONE

请有人解释所有的战略之间的差异?

检查最新的学说文件

这里是一个总结:可能的生成策略列表:

AUTO(默认值) :指示Doctrineselect使用的数据库平台所偏好的策略。 首选的策略是MySQL,SQLite和MsSQL的IDENTITY和Oracle和PostgreSQL的SEQUENCE 。 这个策略提供了完全的便携性。

SEQUENCE:指示Doctrine使用数据库序列进行ID生成。 这个策略目前不提供完全的可移植性。 Oracle和PostgreSQL支持序列。

IDENTITY:告诉Doctrine在数据库中使用特殊标识列,在插入行时生成一个值。 这个策略目前不提供完全的可移植性,并且受以下平台支持:

  • MySQL / SQLite => AUTO_INCREMENT
  • MSSQL => IDENTITY
  • PostgreSQL => SERIAL

表:指示Doctrine使用单独的表来生成ID 。 这个策略提供了完全的便携性。 这个策略还没有实施!

无:告诉Doctrine标识符是由您的代码分配,从而生成的。 赋值必须在新实体传递给EntityManager#persist之前进行。 NONE与完全@GeneratedValue相同。

自从版本2.3:

UUID:指示Doctrine使用内置的通用唯一标识符生成器。 这个策略提供了完全的便携性。

当然接受的答案是正确的,但是需要更新如下:

根据文档的 注释部分:

这个注释是可选的只有在和@Id一起使用时才有意义 。 如果未使用@Id指定此注释,则将使用NONE策略作为默认值。

策略属性是可选的

根据文档的 基本映射部分:

SEQUENCE :指示Doctrine使用数据库序列进行ID生成。 这个策略目前不提供完全的可移植性。 序列由OraclePostgreSqlSQL Anywhere支持

IDENTITY :告诉Doctrine在数据库中使用特殊标识列,在插入行时生成一个值。 这个策略目前不提供完全的可移植性,并且受以下平台支持:

  • MySQL / SQLite / SQL Anywhere (AUTO_INCREMENT)
  • MSSQL (IDENTITY)
  • PostgreSQL (SERIAL)。

Downvote

关于由某人给出的downvote,应该注意的是SQL Anywhere已经被添加,并且接受的答案需要一个小的更新