Php Doctrine2不';t将id列(postgres)的序列设置为默认值

Php Doctrine2不';t将id列(postgres)的序列设置为默认值,php,postgresql,sequence,doctrine-orm,Php,Postgresql,Sequence,Doctrine Orm,举个简单的例子:如果我想在postgres中创建一个具有自动填充id的表,我运行以下sql: CREATE SEQUENCE person_id_seq START 1; CREATE TABLE person ( id integer PRIMARY KEY DEFAULT nextval('person_id_seq'), name varchar(100) NOT NULL ); 在教义中我设定了所有的财产 class Person {

举个简单的例子:如果我想在postgres中创建一个具有自动填充id的表,我运行以下sql:

CREATE SEQUENCE person_id_seq  START 1;

CREATE TABLE person (
    id         integer PRIMARY KEY DEFAULT nextval('person_id_seq'),
    name       varchar(100) NOT NULL
);
在教义中我设定了所有的财产

class Person {

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue(strategy="SEQUENCE")
 * @SequenceGenerator(sequenceName="person_id_seq", initialValue=1, allocationSize=100)
 */
private $id;
但是当我生成sql(php:orm:schema tool:create--dump sql)时,我得到了:

CREATE TABLE person (
    id INT NOT NULL,
    name VARCHAR(100) NOT NULL
);
CREATE SEQUENCE person_id_seq INCREMENT BY 100 MINVALUE 1 START 1
但不要将其设置为默认值

\d人

      Column       |              Type              | Modifiers
-------------------+--------------------------------+-----------
 id                | integer                        | not null
...
..
.
从:

4.8.1。标识符生成策略

AUTO
(默认):告诉条令选择所用数据库平台首选的策略。首选的策略是MySQL、SQLite和MsSQL的标识策略,Oracle和PostgreSQL的顺序策略。此策略提供了完全的可移植性。

IDENTITY
:告诉条令在数据库中使用特殊的IDENTITY列,在插入行时生成值。该策略目前没有提供完全的可移植性,并且受到以下平台的支持:MySQL/SQLite(自动增量)、MSSQL(标识)和PostgreSQL(串行)

他们建议
AUTO
以实现最大的便携性:

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue
 */
这将为您创建并连接一个序列。另一种方法是使用
IDENTITY
策略请求一个
serial
列:

/**
 * @Id
 * @Column(type="integer", nullable=false)
 * @GeneratedValue(strategy="IDENTITY")
 */
这个应该将您的
id
列创建为type
serial
,PostgreSQL将创建序列并为您设置默认值

文档表明您所做的应该是可行的,但文档通常只提供了现实的简化版本


尝试使用
strategy=“AUTO”
。如果不起作用,请尝试
strategy=“IDENTITY”

我今天遇到了这个问题,我发现:

  • 标识工作正常,因为它对PostgreSQL使用串行类型,它会自动创建相关序列并将默认值设置为nextval(序列)

  • 自动创建表和相关序列,但不为id列设置默认值。 可通过添加以下代码进行设置:

    /**
     * Webpage's ID
     *
     * @ORM\Id
     * @ORM\Column(type="integer", options={"default"="nextval('webpages_id_seq'::regclass)"})
     * @ORM\GeneratedValue(strategy="IDENTITY")
     */
    protected $id;
    
    但不幸的是,我们必须先创建表,所以我们需要交换创建表和序列的SQL代码,以便首先创建序列

  • 顺序的工作原理与自动相同


我还遇到,序列是生成的,但没有分配

因此,这是
bin/console原则的输出:schema:create--dumpsql

CREATE TABLE data_sample (id INT NOT NULL, hashvalue VARCHAR(64) DEFAULT NULL, date TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, refdate TIMESTAMP(0) WITHOUT TIME ZONE NOT NULL, value NUMERIC(20, 2) NOT NULL, PRIMARY KEY(id));

CREATE SEQUENCE data_sample_id_seq INCREMENT BY 1 MINVALUE 1 START 1;

XML PostgreSQL串行类型示例

<id name="addressId" type="integer" column="address_id">
  <generator strategy="IDENTITY"/>
  <options>
    <option name="default">nextval('decide_config.address_address_id_seq'::regclass)</option>
  </options>
</id>

nextval('decision\u config.address\u address\u id\u seq'::regclass)

适用于新来者;github上存在与此问题相关的新PR: