Doctrine2 不会将序列设置为 id 列的默认值(postgres)

2022-08-31 00:40:16

举个简单的例子:如果我想在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 doctrine 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
...
..
.

答案 1

精细手册

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

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

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

这应该为您创建并连接一个序列。另一种方法是使用该策略请求一个列:serialIDENTITY

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

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

文档表明您正在做的事情应该有效,但文档通常只提供现实的简化版本。

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


答案 2

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

  • IDENTITY工作得很好,因为它对PostgreSQL使用SERIAL类型,它会自动创建相关序列并将默认值设置为nextval(sequence)

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

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

    但不幸的是,Doctrine首先创建表,因此我们需要交换SQL代码创建表和序列,以便首先创建该序列

  • 序列的工作方式与自动相同


推荐