2011-05-20 40 views
12

只是一个简单的例子:如果我想创建的Postgres,支持自动填充ID的表我运行该SQL:Doctrine2 doesen't顺序设置为默认的ID列(Postgres的)

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:架构工具:创建--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 
... 
.. 
. 
+0

对于新手;在github上存在一个与此问题相关的新PR:https://github.com/doctrine/dbal/pull/669 – edigu 2014-10-28 14:04:11

回答

22

fine manual

4.8.1。标识符生成策略
...
AUTO(默认值):指示Doctrine选择所用数据库平台首选的策略。首选的策略是MySQL,SQLite和MsSQL的IDENTITY以及Oracle和PostgreSQL的SEQUENCE。该策略提供了完全的可移植性。
...
IDENTITY:指示Doctrine在数据库中使用特殊标识列来生成插入行时的值。这种策略目前不提供完全的可移植性,并受以下平台支持:MySQL/SQLite(AUTO_INCREMENT),MSSQL(IDENTITY)和PostgreSQL(SERIAL)。

他们建议AUTO最大的可移植性:

/** 
* @Id 
* @Column(type="integer", nullable=false) 
* @GeneratedValue 
*/ 

这应该为你创建及导线上的序列。另一种方法是,要求使用IDENTITY策略serial柱:

/** 
* @Id 
* @Column(type="integer", nullable=false) 
* @GeneratedValue(strategy="IDENTITY") 
*/ 

这一个应该创建idserial类型和PostgreSQL将创建序列,并为您设置的默认值。

该文档指出您正在做的事情应该可以工作,但文档通常只提供简化版本的实际情况。

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

4

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

  • IDENTITY工作很好,因为它采用串行类型的PostgreSQL,它会自动创建相关的序列并设置为默认值NEXTVAL(序列)

  • AUTO会创建表格,然后创建相关序列,但不会为id列设置默认值。 它可以通过添加以下代码来设置:

    /** 
    * Webpage's ID 
    * 
    * @ORM\Id 
    * @ORM\Column(type="integer", options={"default"="nextval('webpages_id_seq'::regclass)"}) 
    * @ORM\GeneratedValue(strategy="IDENTITY") 
    */ 
    protected $id; 
    

    可惜主义首先创建表,所以我们需要换SQL代码创建表和序列,以便序列将首先创建

  • SEQUENCE作品与AUTO相同