Php Doctrine2不';t将id列(postgres)的序列设置为默认值
举个简单的例子:如果我想在postgres中创建一个具有自动填充id的表,我运行以下sql: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 {
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
列创建为typeserial
,PostgreSQL将创建序列并为您设置默认值
文档表明您所做的应该是可行的,但文档通常只提供了现实的简化版本
尝试使用
strategy=“AUTO”
。如果不起作用,请尝试strategy=“IDENTITY”
我今天遇到了这个问题,我发现:
- 标识工作正常,因为它对PostgreSQL使用串行类型,它会自动创建相关序列并将默认值设置为nextval(序列)
- 自动创建表和相关序列,但不为id列设置默认值。
可通过添加以下代码进行设置:
但不幸的是,我们必须先创建表,所以我们需要交换创建表和序列的SQL代码,以便首先创建序列/** * Webpage's ID * * @ORM\Id * @ORM\Column(type="integer", options={"default"="nextval('webpages_id_seq'::regclass)"}) * @ORM\GeneratedValue(strategy="IDENTITY") */ protected $id;
- 顺序的工作原理与自动相同
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: