2011-05-20 84 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相同